LinkedBlockingQueue和ConcurrentLinkedQueue详细用法

1.LinkedBlockingQueue:java.util.concurrent

API中的解释:

public class LinkedBlockingQueue extends AbstractQueue implements BlockingQueue, Serializable

一个基于已链接节点的、范围任意的 blocking queue。此队列按 FIFO(先进先出)排序元素。队列的头部 是在队列中时间最长的元素。队列的尾部 是在队列中时间最短的元素。新元素插入到队列的尾部,并且队列检索操作会获得位于队列头部的元素。链接队列的吞吐量通常要高于基于数组的队列,但是在大多数并发应用程序中,其可预知的性能要低。可选的容量范围构造方法参数作为防止队列过度扩展的一种方法。如果未指定容量,则它等于 Integer.MAX_VALUE。除非插入节点会使队列超出容量,否则每次插入后会动态地创建链接节点。

适用阻塞队列的好处:多线程操作共同的队列时不需要额外的同步,另外就是队列会自动平衡负载,即那边(生产与消费两边)处理快了就会被阻塞掉,从而减少两边的处理速度差距。

 

2.ConcurrentLinkedQueue:java.util.concurrent
API中的解释:

public class ConcurrentLinkedQueueextends AbstractQueueimplements Queue, Serializable

一个基于链接节点的、无界的、线程安全的队列。此队列按照 FIFO(先进先出)原则对元素进行排序。队列的头部 是队列中时间最长的元素。队列的尾部 是队列中时间最短的元素。新的元素插入到队列的尾部,队列检索操作从队列头部获得元素。当许多线程共享访问一个公共 collection 时,ConcurrentLinkedQueue 是一个恰当的选择。此队列不允许 null 元素。

 

扩展:

并发编程中的一种编程方式是把任务拆分为一些的小任务,即Runnable,然后再提交给一个Executor执行,Executor.execute(Runnable).Executor在执行时适用内部的线程池完成操作。Executor在执行时使用内部的线程池完成操作。

 

创建线程池:

Executor executor = Executors.newFixedThreadPool(10);  //创建固定数目线程的线程池

Executor executor = Executors.newCachedThreadPool();  //创建一个可缓存的线程池,调用execute将重用以前构造的线程(如线程可用)。如果现有线程没有可用的。则创建一个新的线程并添加到池中。

 

ExecutorService与生命周期

ExecutorService扩展了Executor并添加了一些生命周期管理的方法。一个Executor的生命周期有三种状态,运行,关闭,终止。Executor创建时出于运行状态。当调用ExecutorService.shutdown()后,出于关闭状态,isShutdown方法返回true。这时,不应该再想Executor中添加任务,所有已添加的任务执行完毕后,Executor出于终止状态,IsTerminated()返回true.如果Executor处于关闭状态,往Executor提交任务会抛出unchecked exception RejectedExecutionException.

API中的解释:

public interface ExecutorService extends Executor

Executor 提供了管理终止的方法,以及可为跟踪一个或多个异步任务执行状况而生成 Future 的方法。 可以关闭 ExecutorService,这将导致其停止接受新任务。关闭后,执行程序将最后终止,这时没有任务在执行,也没有任务在等待执行,并且无法提交新任务。通过创建并返回一个可用于取消执行和/或等待完成的 Future,方法 submit 扩展了基本方法 Executor.execute(java.lang.Runnable)。方法 invokeAny invokeAll 是批量执行的最常用形式,它们执行任务集合,然后等待至少一个,或全部任务完成(可使用 ExecutorCompletionService 类来编写这些方法的自定义变体)。Executors 类提供了用于此包中所提供的执行程序服务的工厂方法。

 

void shutdown():启动一次顺序关闭,执行以前提交的任务,但不接受新任务。如果已经关闭,则调用没有其他作用。

submit(Runnable task) 提交一个 Runnable 任务用于执行,并返回一个表示该任务的 Future。

 

 

 

你可能感兴趣的:(LinkedBlockingQueue和ConcurrentLinkedQueue详细用法)