java的并发工具类
CountDownLatch
被用来同步一个或者多个任务,强制去等待其他线程完成操作。
CountDownLatch c = new CountDownLatch(3);//初始化一个CountDownLatch的对象的计数器的值为3; 任何调用c.await()的方法都被阻塞,直至这个计数值为0; 其他的任务完成工作的时候可以调用c.countDown()来减小计数器的值。 CountDownLatch对象只能被触发一次,它的计数器的值是不能被重置的。CyclicBarrier可以重置。
同步屏障CyclicBarrier
让一组并行工作的线程到达一个屏障(同步点)前被阻塞,直到最后一个线程到达的时候才会继续向前移动。
CyclicBarrier c = new CyclicBarrier(3); // 初始化一组具有三个线程的屏障 CyclicBarrier c = new CyclicBarrier(3, Runnable A);// 初始化一组具有三个线程的屏障,其中到达屏障点时,线程A先执行 每个线程调用c.await()方法来通知CycliBarrier,当计数器达到设定值的时候,自动唤醒执行。 适用于多线程计算数据,最后合并计算结果的场景。 CyclicBarrier的计数器可以通过reset()方法进行重置。
信号量Semaphore
用来控制同时访问特定资源的线程数量,通过协调各个线程来保证合理的使用公共资源。One out one in
Semaphore se = new Semaphore(10); //初始最大允许并发执行的线程数为10的信号量 se.acquire():获取资源许可证 se.release():释放资源许可证 se.tryAcquire():尝试获取资源许可证
线程间交换数据的Exchanger
JDK1.5引入的用于两个线程交换数据的封装工具类。
Exchanger<泛型> e = new Exchanger<>(); //泛型参数指交换的数据类型 e.exchange(泛型数据) :调用该方法进行数据交换,等两个线程都调用了该方法后才会返回(除非当前线程被中断),否则会阻塞 e.exchange(泛型数据,long timeout,TimeUnit unit):调用该方法时,如果超时未等到另一个线程对该方法的调用,就直接超时返回 可用于遗传算法,校对工作场景等。