【面试:并发篇24:多线程:综合练习】顺序控制
00.前言
如果有任何问题请指出,感谢。
01.介绍
我们提出两个问题 分别用wait/notify,park/unpark,await/signal解决。
02.问题一
介绍
我们创建两个线程 从1交替打印到10
wait/notify实现
@Slf4j(topic = "c.TestSun")
public class TestSun {
public static void main(String[] args) {
// 交替打印五轮
TestNumber num = new TestNumber(5);
new Thread(()->{
num.print(true);
},"t1").start();
new Thread(()->{
num.print(false);
},"t2").start();
}
}
@Slf4j(topic = "c.TestNumber")
class TestNumber{
private int cnt = 1;
private boolean flag = true;
private final int count;
public TestNumber(int count){
this.count=count;
}
public void print(boolean flagN){
synchronized (this){
for (int i=0;i<count;i++){
while (flag!=flagN){
try {
this.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
log.debug("{}",cnt);
cnt++;
flag=!flag;
this.notify();
}
}
}
}
结果
23:45:24.559 c.TestNumber [t1] - 1
23:45:24.562 c.TestNumber [t2] - 2
23:45:24.562 c.TestNumber [t1] - 3
23:45:24.562 c.TestNumber [t2] - 4
23:45:24.562 c.TestNumber [t1] - 5
23:45:24.562 c.TestNumber [t2] - 6
23:45:24.562 c.TestNumber [t1] - 7
23:45:24.562 c.TestNumber [t2] - 8
23:45:24.562 c.TestNumber [t1] - 9
23:45:24.562 c.TestNumber [t2] - 10
park/unpark实现
@Slf4j(topic = "c.TestSunPark")
public class TestSunPark {
static Thread t1;
static Thread t2;
public static void main(String[] args) {
// 交替打印5次
TestParkNum num = new TestParkNum(5);
t1 = new Thread(()