=
public class CyclicBarrierTest2 {
static CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new A());
public static void main(String[] args) {
new Thread(()->{
try {
cyclicBarrier.await();
}catch (Exception e){
}
System.out.println(1);
}).start();
try{
cyclicBarrier.await();
}catch (Exception e){
}
System.out.println(2);
}
static class A implements Runnable {
@Override
public void run() {
System.out.println("3");
}
}
}
《java并发编程艺术》上看到的,为什么这段代码输出一定是312?
3第一个输出没问题,但1和2不是应该随机顺序吗?
于是我好奇又加了一个线程
public class CyclicBarrierTest2 {
static CyclicBarrier cyclicBarrier = new CyclicBarrier(3, new A());
public static void main(String[] args) {
new Thread(()->{
try {
cyclicBarrier.await();
}catch (Exception e){
}
System.out.println(1);
}).start();
new Thread(()->{
try {
cyclicBarrier.await();
}catch (Exception e){
}
System.out.println(4);
}).start();
try{
cyclicBarrier.await();
}catch (Exception e){
}
System.out.println(2);
}
static class A implements Runnable {
@Override
public void run() {
System.out.println("3");
}
}
}
发现除了3是第一个输出,其他都是随机的,好奇怪= =
[https://blog.csdn.net/weixin_39933336/article/details/111819084?utm_medium=distribute.pc_relevant.none-task-blog-2~default~baidujs_title~default-0.pc_relevant_paycolumn_v2&spm=1001.2101.3001.4242.1&utm_relevant_index=3](Main一定会比new Thread(一个)的执行的快)
如果main里面有多个new Thread他们之间就是随机的
public class CyclicBarrierDemo1 {
// 第一步会执行这个静态语句
static CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new A());
/**
* 输出结果:
* 实例化
* Thread-0到达栅栏
* main到达栅栏
* 1
* 2
* 3
* 4
* 5
*
* @param args
* @throws InterruptedException
*/
public static void main(String[] args) throws InterruptedException {
new Thread(() -> {
System.out.println(Thread.currentThread().getName() + "到达栅栏");
try {
// 这里wait了(await() 表示自己[new Thread]已经到达栅栏),由CyclicBarrier实例化的参数parties可知,需要两个线程同时到达栅栏,所以这里卡住
cyclicBarrier.await();
// 最后一个到达线程[new Thread]要做的任务 - 输出线程完成最后任务 这里会执行输出1
System.out.println(2);
} catch (Exception e) {
}
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(5);
}).start();
// 如果这个限制放开 1-3-4-2-5
// Thread.sleep(1000);
try {
// 这里会比new Thread先执行
System.out.println(Thread.currentThread().getName() + "到达栅栏");
// 这里wait了(await() 表示自己[Main线程]已经到达栅栏),卡住
cyclicBarrier.await();
System.out.println(3);
} catch (Exception e) {
}
System.out.println(4);
}
static class A implements Runnable {
public A() {
System.out.println("实例化");
}
@Override
public void run() {
System.out.println("1");
}
}
}
您好,我是有问必答小助手,您的问题已经有小伙伴帮您解答,感谢您对有问必答的支持与关注!