package ao.com;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
//await和signal。ReentrantLock实现交替打印。
public class Test03 {
public static void main(String[] args) throws InterruptedException {
AwaitSingnal awaitSingnal = new AwaitSingnal(5);
//各自的条件区域
Condition a = awaitSingnal.newCondition();
Condition b = awaitSingnal.newCondition();
Condition c = awaitSingnal.newCondition();
Thread t1 = new Thread(()->{
awaitSingnal.print("a",a,b);
},"t1");
Thread t2 = new Thread(()->{
awaitSingnal.print("b",b,c);
},"t2");
Thread t3 = new Thread(()->{
awaitSingnal.print("c",c,a);
},"t3");
t1.start();
t2.start();
t3.start();
Thread.sleep(1000);
//主线程初始化,唤醒a阻塞区域,打印第一个a
awaitSingnal.lock();
try {
a.signal();
} finally {
awaitSingnal.unlock();
}
}
}
class AwaitSingnal extends ReentrantLock{
//循环次数
private int loopNumber;
public AwaitSingnal(int loopNumber){
this.loopNumber = loopNumber;
}
//打印的时候需要的参数有:打印内存、当前阻塞区域(a区域,b区域,c区域)、下一个要打印唤醒的区域。
public void print(String s, Condition current,Condition next){
int i = 0 ;
while (i++ < loopNumber){
lock();
try {
//先让需要打印的内容全部放在各自的阻塞区域中
current.await();
//初始化唤醒的时候就打印了
System.out.print(s);
//唤醒下一个
next.signal();
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
unlock();
}
}
}
}
ReentrantLock实现交替打印abc。(await&signal)
最新推荐文章于 2023-07-08 10:13:40 发布