Java多线程问题--使用ReentrantLock类和Condition类实现多线程顺序执行

本文内容部分引自《Java多线程编程核心技术》,感谢作者!!!

代码地址:https://github.com/xianzhixianzhixian/thread.git

原理其实很简单:使用不同的Condition实例即可,和这篇文章里的唤醒特定线程有异曲同工之处

https://blog.csdn.net/XIANZHIXIANZHIXIAN/article/details/86484469

多线程顺序执行实例

Run.java

/**
 * 使用Condition实现线程的顺序执行
 * @author: xianzhixianzhixian
 * @date: 2019-01-22 21:32
 */
public class Run {
    /**
     * 这里不需要加vloatile关键字,因为lock.lock()、lock.unlock()具有和synchronized一样的功能:使线程线程工作内存中的
     * 私有变量和公共内存中的变量双向同步的功能
     */
    volatile private static int nextPrintWho = 1;
    private static ReentrantLock lock = new ReentrantLock();
    final private static Condition conditionA = lock.newCondition();
    final private static Condition conditionB = lock.newCondition();
    final private static Condition conditionC = lock.newCondition();
    public static void main(String[] args) {
        Thread threadA = new Thread() {
            @Override
            public void run() {
                try {
                    lock.lock();
                    while (nextPrintWho != 1){
                        conditionA.await();
                    }
                    for (int i = 0; i < 3; i++) {
                        System.out.println("ThreadA "+(i+1)+" "+Thread.currentThread().getName());
                    }
                    nextPrintWho = 2;
                    conditionB.signalAll();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        };

        Thread threadB = new Thread() {
            @Override
            public void run() {
                try {
                    lock.lock();
                    while (nextPrintWho != 2){
                        conditionA.await();
                    }
                    for (int i = 0; i < 3; i++) {
                        System.out.println("ThreadA "+(i+1)+" "+Thread.currentThread().getName());
                    }
                    nextPrintWho = 3;
                    conditionC.signalAll();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        };

        Thread threadC = new Thread() {
            @Override
            public void run() {
                try {
                    lock.lock();
                    while (nextPrintWho != 3){
                        conditionA.await();
                    }
                    for (int i = 0; i < 3; i++) {
                        System.out.println("ThreadA "+(i+1)+" "+Thread.currentThread().getName());
                    }
                    nextPrintWho = 1;
                    conditionA.signalAll();
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    lock.unlock();
                }
            }
        };

        Thread[] aArray = new Thread[5];
        Thread[] bArray = new Thread[5];
        Thread[] cArray = new Thread[5];
        for (int i = 0; i < 5; i++) {
            aArray[i] = new Thread(threadA);
            bArray[i] = new Thread(threadB);
            cArray[i] = new Thread(threadC);
            aArray[i].start();
            bArray[i].start();
            cArray[i].start();
        }
    }
}

运行结果:可以看到多个不同的线程顺序打印123

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章