countdownlatch和CyclicBarrier

当前任务要等待其他线程的任务执行完之后在执行。

CountDownLatch countDownLatch = new CountDownLatch(N);

countDownLatch.countDown(); count = N - 1

countDownLatch.await();(阻塞) 当count == 0 的时候  继续执行

怕 子线程执行的过程中 主线程提前结束。主线程资源被回首。那子线程就没法子运行了。

 

CyclicBarrier 当前线程是要等到所有的线程到达barriar状态后,然后在逗继续执行。

await()会阻塞当前线程 当其他线程都调用await()(await会使线程到达barriar状态)的时候,在继续执行。

c.await();//使线程到达barriar状态

CyclicBarrier 的构造函数

CyclicBarrier c = new CyclicBarrier(N);

CyclicBarrier c = new CyclicBarrier(N, new Runnable(){

@Ovrride

run(){

}

})//这个里面的runnable当所有的线程到达await之后 执行run  然后在执行各自线程的代码。

 CyclicBarrier 是可以重用的 。CountDownLatch 不能重用 。因为CountDownLatch是通过控制数量来实现同步,那数量减到0了当然就不能再用了。 但是CyclicBarrier 没有显式的去减数量

 

Semaphore  acquire  和release

Semaphore s = new Semaphore(5);5个锁

s.acquier() 获得一个锁  锁数量大于5的时候才能acquire

s.release 释放一个锁  先acquie  才能release

 

posted @ 2018-12-20 10:50  saveworld_niub  阅读(176)  评论(0)    收藏  举报