ReentrantLock测试

 

博客:https://www.jianshu.com/p/7058c21e615e

    public static void main(String[] args) {
       test3();
    }


    public static void test1() {
        Runnable runnable = () -> {
            for (int i = 0; i < 3; i++) {
                System.out.println(Thread.currentThread().getName() + "输出了 " );
            }
        };
        new Thread(runnable, "a").start();
        new Thread(runnable, "b").start();
    }

    public static void test2() {
        ReentrantLock lock = new ReentrantLock();

        Runnable runnable = () -> {
            try {
                lock.lock();
                for (int i = 0; i < 3; i++) {
                    System.out.println(Thread.currentThread().getName() + "输出了:  " + i);
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            } finally {
                lock.unlock();
            }
        };
        new Thread(runnable, "a").start();
        new Thread(runnable, "b").start();
    }

    public static void test3() {
        AtomicInteger nextThread = new AtomicInteger(1);

        ReentrantLock lock = new ReentrantLock();
        Condition conditionA = lock.newCondition();
        Condition conditionB = lock.newCondition();

        Runnable runnableA = () -> {
            for(; ; ) {
                try {
                    lock.lock();
                    while (nextThread.get() != 1) {
                        conditionA.await();
                    }
                    System.out.println(Thread.currentThread().getName() + " 输出了A  ");
                    nextThread.set(2);
                    conditionB.signalAll();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                } finally {
                    lock.unlock();
                }
            }
        };

        Runnable runnableB = () -> {
            for(; ; ){
                try {
                    lock.lock();
                    while (nextThread.get() != 2) {
                        conditionB.await();
                    }
                    System.out.println(Thread.currentThread().getName() + " 输出了B  ");
                    nextThread.set(1);
                    conditionA.signalAll();
                } catch (Exception e) {
                    throw new RuntimeException(e);
                } finally {
                    lock.unlock();
                }
            }
        };

        new Thread(runnableA, "a").start();
        new Thread(runnableB, "b").start();
    }

 

 
posted @ 2022-11-21 11:50  Peter.Jones  阅读(40)  评论(0)    收藏  举报