四个线程输出六次,依次输出AiBiCiDi
输出示例:
使用阻塞队列实现,通过定义四个阻塞队列实现同步机制
class Solution{
private BlockingQueue<Integer> listA = new LinkedBlockingQueue<>(1);
private BlockingQueue<Integer> listB = new LinkedBlockingQueue<>(1);
private BlockingQueue<Integer> listC = new LinkedBlockingQueue<>(1);
private BlockingQueue<Integer> listD = new LinkedBlockingQueue<>(1);
public void printA(){
new Thread(() -> {
for (int i = 0; i < 6; i++) {
try {
listA.take(); //take完重新阻塞
System.out.print("A"+i);
listB.put(i); //唤醒B
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
public void printB(){
new Thread(() -> {
for (int i = 0; i < 6; i++) {
try {
listB.take(); //一开始阻塞,被printA唤醒,take后重新阻塞
System.out.print("B"+i);
listC.put(i); //唤醒C
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
public void printC(){
new Thread(() -> {
for (int i = 0; i < 6; i++) {
try {
listC.take(); //一开始阻塞,被printB唤醒,take后重新阻塞
System.out.print("C"+i);
listD.put(i); //唤醒D
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}).start();
}
public void printD(){
new Thread(() -> {
for (int i = 0; i < 6; i++) {
try {
listD.take(); //一开始阻塞,被printC唤醒,take后重新阻塞
System.out.print("D"+i);
listA.put(i); //唤醒A
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println();
}
}).start();
}
public static void main(String[] args) throws InterruptedException {
Solution solution = new Solution();
solution.listA.put(1); //一开始A队列put值,是printA可以被唤醒
solution.printA();
solution.printB();
solution.printC();
solution.printD();
}
}
结果: