1.CountDownLatch
允许一个或多个线程等待直到在其他线程中执行的一组操作完成的同步辅助。
public CountDownLatch(int count)构造一个以给定计数
CountDownLatch CountDownLatch。
参数
count -的次数 countDown()必须调用之前线程可以通过 await()
异常
IllegalArgumentException - 如果 count为负数
public void countDown()
减少锁存器的计数,如果计数达到零,释放所有等待的线程。
如果当前计数大于零,则它将递减。 如果新计数为零,则所有等待的线程都将被重新启用以进行线程调度。
如果当前计数等于零,那么没有任何反应。
public void await()
throws InterruptedException
导致当前线程等到锁存器计数到零,除非线程是interrupted 。
如果当前计数为零,则此方法立即返回。
示例:
CountDownLatch countDownLatch = new CountDownLatch(10);
for(int i = 0;i<10;i++){
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"***");
countDownLatch.countDown();//数量-1
},String.valueOf(i)).start();
}
countDownLatch.await(); //等待计数器变为0结束
System.out.println("end");
2.CyclicBarrier
允许一组线程全部等待彼此达到共同屏障点的同步辅助。 循环阻塞在涉及固定大小的线程方的程序中很有用,这些线程必须偶尔等待彼此。 屏障被称为循环 ,因为它可以在等待的线程被释放之后重新使用。
A CyclicBarrier支持一个可选的Runnable命令,每个屏障点运行一次,在派对中的最后一个线程到达之后,但在任何线程释放之前。 在任何一方继续进行之前,此屏障操作对更新共享状态很有用。
await如果当前线程不是最后一个线程,那么它被禁用以进行线程调度,并且处于休眠状态,直到发生下列事情之一await
最后一个线程到达; 要么
一些其他线程当前线程为interrupts ; 要么
一些其他线程interrupts其他等待线程之一; 要么
一些其他线程在等待屏障时超时; 要么
其他一些线程在这个屏障上调用reset() 。
示例`
CyclicBarrier cyclicBarrier = new CyclicBarrier(8); //线程达到8才结束
for (int i = 0;i<8;i++){
new Thread(()->{
System.out.println(Thread.currentThread().getName()+"***");
try {
cyclicBarrier.await();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}).start();
}