需求
编写一个程序,开启 3 个线程,这三个线程的 ID 分别为A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。
如:ABCABCABC…… 依次递归。
测试代码
package juc.swap;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;
public class ThreadSwap {
public static void main(String[] args) {
Alternate alternate = new Alternate();
AThread aThread = new AThread(alternate);
BThread bThread = new BThread(alternate);
CThread cThread = new CThread(alternate);
new Thread(aThread).start();
new Thread(bThread).start();
new Thread(cThread).start();
}
}
/* * 通过序号number来控制打印顺序 */
// 打印程序
class Alternate {
private volatile int number = 1;
Lock lock = new ReentrantLock();
Condition condition = lock.newCondition();
public void printA() {
lock.lock();
try {
// while:保证被唤醒之后number是等于1的(解决虚假唤醒)
while(number != 1) {
condition.await();
}
System.out.println("A" + ":" + number);
// 改变number的值,等待B被打印
number = 2;
condition.signalAll();
} catch (InterruptedException e) {
} finally {
lock.unlock();
}
}
public void printB() {
lock.lock();
try {
while(number != 2) {
condition.await();
}
System.out.println("B" + ":" + number);
number = 3;
condition.signalAll();
} catch (InterruptedException e) {
} finally {
lock.unlock();
}
}
public void printC() {
lock.lock();
try {
while(number != 3) {
condition.await();
}
System.out.println("C" + ":" + number);
number = 1;
condition.signalAll();
} catch (InterruptedException e) {
} finally {
lock.unlock();
}
}
}
class AThread implements Runnable {
private Alternate alternate;
public AThread(Alternate alternate) {
this.alternate = alternate;
}
@Override
public void run() {
for(int i = 0; i < 10; ++i) {
alternate.printA();
}
}
}
class BThread implements Runnable {
private Alternate alternate;
public BThread(Alternate alternate) {
this.alternate = alternate;
}
@Override
public void run() {
for(int i = 0; i < 10; ++i) {
alternate.printB();
}
}
}
class CThread implements Runnable {
private Alternate alternate;
public CThread(Alternate alternate) {
this.alternate = alternate;
}
@Override
public void run() {
for(int i = 0; i < 10; ++i) {
alternate.printC();
}
}
}
其它
关注下方微信公众号,
回复:
JUC.code
欢迎加入交流群:451826376
更多信息:www.itcourse.top