Java 线程池ThreadPoolExecutor之阻塞队列

ThreadPoolExecutor函数:

public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)
其中有一个参数是BlockingQueue workQueue,是阻塞队列,和线程池一起实现了生产者-消费者模式。

什么是生产者-消费者模式呢?

就是当生产者生产的东西一定数量,消费者来不及消费,生产者会等待着消费者消费了再生产,如果生产者生产不够消费者消费,消费者会等待生产者生产东西。

假如队列是空的,线程池会等待任务加入到队列中,队列满了,队列会等待线程池执行完任务再重新加入。

阻塞队列BlockingQueue

ArrayBlockingQueue

是一个由数组结构组成的有界阻塞队列,是先进先出的原则进行排序。

ArrayBlockingQueue fairQueue = new  ArrayBlockingQueue(1000,true);

可以插入和删除是阻塞的,遵守先进先出的原则。

LinkedBlockingQueue

是一个由链表结构组成的有界阻塞队列,如果不制定大小,默认是Interger.MAX_VALUE, 先进先出原则

SynchronousQueue

是一个不存储元素的阻塞队列。每一个put操作必须等待一个take操作,否则不能继续添加元素。线程池中用这个队列,必须有一个线程可以执行队列中获取的任务。

DelayQueue

是一个支持延时获取元素的无界阻塞队列。队列使用PriorityQueue来实现。队列中的元素必须实现Delayed接口,在创建元素时可以制定多久才能从队列中获取当前元素。只有在时间到时,才能从队列中获取元素。

应用场景:

缓存系统的设计:可以用DelayQueue保存缓存元素的有效期,使用一个线程循环查询DelayQueue,一旦能从DelayQueue中获取元素时,表示缓存有效期到了。

定时任务调度。使用DelayQueue保存当天将会执行的任务和执行时间,一旦从DelayQueue中获取到任务就开始执行,TimeQueue就是使用DelayQueue。

还有其他的阻塞队列,比如PriorityBlockingQueue,LinkedTransferQueue,LinkedBlockingDeque等。

 

你可能感兴趣的:(Java,进阶知识)