本文内容部分引自《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