线程交替执行打印abcabcabcabcabc
wait-notify
package demo1;
public class JiaoTi1 {
public static void main(String[] args) {
WaitNofy wn=new WaitNofy(1,5);
new Thread(()->{
wn.print("a",1,2);
}).start();
new Thread(()->{
wn.print("b",2,3);
}).start();
new Thread(()->{
wn.print("c",3,1);
}).start();
}
static class WaitNofy{
private int flag;//等待标记
private int loopNumber;//循环次数
public WaitNofy(int flag, int loopNumber) {
this.flag = flag;
this.loopNumber = loopNumber;
}
//打印
public void print(String str,int waitFlag,int nextFlag){
for (int i = 0; i <loopNumber ; i++) {
synchronized (this){
while (flag!=waitFlag){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.print(str);//打印
flag=nextFlag;//修改标记为下一个标记
this.notifyAll();
}
}
}
}
}
ReentrantLock方法(await,Condition,singal)
package demo1;
import java.util.concurrent.locks.Condition;
import java.util.concurrent.locks.ReentrantLock;
public class JiaoTi2 {
public static void main(String[] args) throws InterruptedException {
AwaitSignal as=new AwaitSignal(5);
Condition a=as.newCondition();
Condition b=as.newCondition();
Condition c=as.newCondition();
new Thread(()->{
as.print("a",a,b);
}).start();
new Thread(()->{
as.print("b",b,c);
}).start();
new Thread(()->{
as.print("c",c,a);
}).start();
//执行print代码时,各自进入各自的休息室休息,主线程先唤醒a线程,让其执行
Thread.sleep(1000);
as.lock();
try{
System.out.println("开始");
a.signal();//主线程先唤醒a线程,
}finally {
as.unlock();
}
}
}
class AwaitSignal extends ReentrantLock{
private int loopNumber;
public AwaitSignal(int loopNumber) {
this.loopNumber = loopNumber;
}
public void print(String str, Condition current,Condition next){
for (int i = 0; i <loopNumber ; i++) {
lock();//上锁
try {
current.await();//进入休息室等待
System.out.print(str);
next.signal();//唤醒下一个休息室的线程
} catch (InterruptedException e) {
e.printStackTrace();
}finally {
unlock();
}
}
}
}