摘要:作用屏障拦截,构造参数可以传递拦截的线程数量,以及拦截后调用的类。线程休眠了秒,线程休眠了秒,但是线程并没有先执行,所以他是在等线程到达屏障。和可以一个线程执行多次,执行多次是无效的。是由外部决定下一步的,是由多个线程自己决定下一步的。
作用
屏障拦截,构造参数可以传递拦截的线程数量,以及拦截后调用的Runnable类。每当线程调用await方法的时候,就告诉CyclicBarrier已经到达了屏障,然后阻塞在那边,等全部线程都到达了屏障,线程开始执行。
主要方法await:告诉CyclicBarrier已经到达了屏障
示例public class CyclicBarrierDemo { static CyclicBarrier cyclicBarrier = new CyclicBarrier(2, new Thread3()); static int num = 0; static class Thread1 implements Runnable { @Override public void run() { try { num += 1; Thread.sleep(5000); cyclicBarrier.await(); System.out.println(Thread.currentThread().getName() + "-" + 1); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } } static class Thread2 implements Runnable { @Override public void run() { try { num += 1; Thread.sleep(1000); cyclicBarrier.await(); System.out.println(Thread.currentThread().getName() + "-" + 2); } catch (InterruptedException e) { e.printStackTrace(); } catch (BrokenBarrierException e) { e.printStackTrace(); } } } static class Thread3 implements Runnable { @Override public void run() { System.out.println(Thread.currentThread().getName() + ":num=" + num); } } public static void main(String[] args) { Thread thread1 = new Thread(new Thread1(), "thread1"); Thread thread2 = new Thread(new Thread2(), "thread2"); thread1.start(); thread2.start(); System.out.println(Thread.currentThread().getName() + ":" + 0); } }
运行结果如下:
线程3等到线程1和线程2同时到达屏障后,才执行,这个时候,取到的num就是2了。
线程2休眠了1秒,线程1休眠了5秒,但是线程2并没有先执行,所以他是在等线程1到达屏障。
CountDownLatch可以一个线程执行多次countDown,CyclicBarrier执行多次是无效的。
CountDownLatch是由外部决定下一步的,CyclicBarrier是由多个线程自己决定下一步的。
比如上课点名,有些老师很随意,只要人数满了,就开始上课,不管有部分学生变音喊到,都记有人来上课,这个时候就是CountDownLatch。有些课程没有老师,位置坐满人了,AI播放视频开始上课,这个时候就是CyclicBarrier。
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/75275.html
摘要:作用等待其他线程执行完后,在执行某个线程。可以多个线程插队到线程,线程等多个线程结束后才执行类似后面的,而可以等待多个线程执行完才执行,灵活性比更大。示例执行结果如下虽然线程休眠了秒,但是依然等到线程输出后,才输出。 作用 等待其他线程执行完后,在执行某个线程。类似之前的join,但是比join更强大。join可以多个线程插队到A线程,A线程等多个线程结束后才执行(类似后面的Cycli...
摘要:线程安全问题在并发编程学习之基础概念提到,多线程的劣势之一,有个线程安全问题,现在看看下面的例子。那么,该怎么解决呢,很简单,在方法前加个同步锁。运行结果如下有两种情况,是因为看谁先抢占锁,但是输出的算法结果是正确的。 线程安全问题 在java并发编程学习之基础概念提到,多线程的劣势之一,有个线程安全问题,现在看看下面的例子。 public class NotSafeDemo { ...
摘要:在并发编程学习之显示锁里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在源码分析的基础上,我们看看和的区别在什么地方。而非公平锁直接尝试获取锁。 在java并发编程学习之显示锁Lock里有提过公平锁和非公平锁,我们知道他的使用方式,以及非公平锁的性能较高,在AQS源码分析的基础上,我们看看NonfairSync和FairSync的区别在什么地方。 lock方法 ...
摘要:在并发编程学习之三种线程启动方式中有提过。是否执行结束,包括正常执行结束或异常结束。获取返回值,没有得到返回值前一直阻塞。运行结果如下由于任务被取消,所以抛出异常。注意的是,此时线程还在跑,和返回的是。并不能让任务真正的结束。 FutureTask 在java并发编程学习之三种线程启动方式中有提过。主要的方法如下: cancel(boolean mayInterruptIfRunni...
摘要:但是的语义不足以确保递增操作的原子性,在多线程的情况下,线程不一定是安全的。检查某个状态标记,以判断是否退出循环某个方法这边和用普通的变量的区别是,在多线程的情况下,取到后,的值被改变了,判断会不正确。 多线程为什么是不安全的 这边简单的讲述一下,参考java并发编程学习之synchronize(一) 当线程A和线程B同时进入num = num + value; 线程A会把num的值...
阅读 3030·2021-11-24 11:14
阅读 3332·2021-11-22 15:22
阅读 3174·2021-09-27 13:36
阅读 641·2021-08-31 14:29
阅读 1302·2019-08-30 15:55
阅读 1703·2019-08-29 17:29
阅读 1105·2019-08-29 16:24
阅读 2364·2019-08-26 13:48