java.util.concurrent并发同步学习笔记

java.util.concurrent包中有五个类的功能:帮助管理相互合作的线程集。该五个类分别为:CyclicBarrier,CountDownLatch,Exchanger,Semaphore,SynchronousQueuer
如果一个相互合作的线程集满足上述五个类的定义,那么应该直接重用合适的库类,而不要试图提供手工的锁与条件的集合。
由于只学习了CyclicBarrier,CountDownLatch,则笔记只整理了这两个。
障栅
CyclicBarrier类实现了一个集结点称为障栅(barrier)。
障栅的适用情况:如果想实现所有的线程一起等待某个事件的发生,当某个事件发生时,所有线程一起开始往下执行。
障栅的实现方式:考虑大量线程运行在一次计算的不同部分的情形。当所有部分都准备好时,需要把结果组合在一起。当一个线程完成了它的那部分任务后,我们让它运行到障栅处。一旦所有的线程都到达了这个障栅,障栅就撤销,线程就可以继续运行。
对于具体的代码细节:
首先,构造一个障栅,并给出参与的线程数
CyclicBarrier barrier=new CyclicBarrier(parties, barrierAction);
CyclicBarrier的构造子有两个形参,parties是线程数,barrierAction为可选的障栅动作,当所有线程到达障栅的时候就会执行这一动作。
每个线程完成它自己的工作后,就在障栅上调用await函数,await方法可以设置超时参数
barrier.await(100, TimeUnit.MILLISECONDS);
障栅被称为是循环的(cyclic),因为可以在所有等待线程被释放后被重用。
倒计时门栓(CountDownLatch)
倒计时门栓让一个线程集等待直到计数变为0。
适用情况:当一个线程集需要一些初始的数据来完成工作。工作器线程被启动并在门外等候。
实现方式: 另一个线程准备数据,当数据准备好的时候,调用countDown将计数减为0,所有工作器线程就可以继续运行了。

猜你喜欢

转载自blog.csdn.net/sdtvyyb_007/article/details/79343067