这道题目在多线程的面试题中可能遇到的比较多,由于最近一直在学习Java多线程编程的知识,这里做一个总结,总结的可能并不是很全面,有问题或者有更好的编程方法也欢迎大家指出。
这道题目的实现方式很多,这里就以我了解的进行一个总结。
首先,我们看一下题目:
有三个线程A、B、C,采用多线程的方式使三个线程轮流执行顺序打印ABC 10次,结果如下:
通过wait/notify实现
package test.printThread.test2;
/**
*
* <p>Title: PrintABCUsingWaitNotify.java</p>
* <p>Description:
* ABCABCABCABCABCABCABCABCABCABC
* <p>
* @author tianqb
* @mail [email protected]
* @date 2019年6月7日下午5:29:39
* @version 1.0
*
*/
public class PrintABCUsingWaitNotify {
private int times;// 打印的次数
private int state = 0;// 打印的状态
private Object objectA = new Object();
private Object objectB = new Object();
private Object objectC = new Object();
public PrintABCUsingWaitNotify(int times) {
super();
this.times = times;
}
public void printA(){
print("A", 0, objectA, objectB);
}
public void printB(){
print("B", 1, objectB, objectC);
}
public void printC(){
print("C", 2, objectC, objectA);
}
public void print(String name, int targetState, Object curr, Object next){
for (int i = 0; i < times;) {
synchronized (curr) {
while(state % 3 != targetState){
try {
curr.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
i++;
state++;
System.out.print(name);
synchronized (next) {
next.notify();
}
}
}
}
public static void main(String[] args) {
PrintABCUsingWaitNotify p = new PrintABCUsingWaitNotify(10);
new Thread(new Runnable() {
@Override
public void run() {
p.printA();
}
}).start();
new Thread(new Runnable() {
@Override
public void run() {
p.printB