CountDownLatch
它被用来同步一个或多个任务, 强制它们等待由其他任务执行的一组操作完成.
你可以向CountDownLatch对象设置一个初始计数值, 任何在这个对象上调用wait()的方法都将阻塞, 直至这个计数值到达0. 任何其他任务在结束其工作时, 可以在该对象上调用countDown()来减小这个计数值. CountDownLatch被设计为只触发一次, 计数值不能被重置. 如果需要能够充值计数值的版本, 则可以使用CyclicBarrier.
调用countDown()的任务在产生这个调用时并没有被阻塞, 只有对await()的调用会被阻塞, 直至计数值到达0.
CyclicBarrier
CyclicBarrier适用于这样的情况: 你希望创建一组任务, 它们并行地执行工作, 然后在进行下一个步骤之前等待, 直至所有任务都完成. 它使得所有的并行任务都将在栅栏处列队, 因此可以一致地向前移动. 这非常像CountDownLatch, 只是CountDownLatch是只触发一次的事件, 而CyclicBarrier可以多次重用.
DelayQueue
这是一个无界的BlockingQueue, 用于放置实现了Delayed接口的对象, 其中的对象只能在其到期时才能从队列中取走. 这种队列是有序的, 即队头对象的延迟到期的时间最长. 如果没有任何延迟到期, 那么就不会有任何头元素, 并且poll()将返回null(所以这种队列中不能放置null).
PriorityBlockingQueue
这是一个很基础的优先级队列, 它具有可阻塞的读取操作.
ScheduledExecutor
ScheduledThreadPoolExecutor scheduler = new ScheduledThreadPoolExecutor(10);
scheduler.schedule(event, 100, TimeUnit.MILLISECONDS);
scheduler.scheduleAtFixedRate(event, 0, 100, TimeUnit.MILLISECONDS);
Semaphore
正常的锁(来自concurrent.lock或内建的synchornized锁)在任何时刻都只允许一个任务访问一项资源, 而计数信号量允许n个任务同时访问这个资源. 你还可以将信号量看作是在向外分发使用资源的"许可证".
作为一个示例, 考虑一个对象池的概念, 它管理着数量有限的对象, 当要使用对象时可以签出它们, 而在用户使用完毕时, 可以将它们签回.
Exchanger
Exchanger是在两个任务之间交换对象的栅栏. 当这些任务进入栅栏时, 它们各自拥有一个对象, 当它们离开时, 它们都拥有之前由对象持有的对象. Exchanger的典型应用场景是: 一个任务在创建对象, 这些对象的生产代价很高昂, 而另一个任务在消费这些对象. 通过这种方式, 可以有更多的对象在被创建的同时被消费.
网友评论