持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情
工作队列
- 主要是对任务的一个缓冲层
首先看一下 父接口
BlockingQueue 有那些实现类
- [ArrayBlockingQueue], [DelayQueue] , [LinkedBlockingDeque] , [LinkedBlockingQueue] , [LinkedTransferQueue] , [PriorityBlockingQueue] , [SynchronousQueue]
今天我们就简单说一下再线程池中常用的 实现类做分析
ArrayBlockingQueue 有界队列
- 此队列对元素进行 FIFO(先进先出)排序
LinkedBlockingDeque 无界队列
- 为什么说是无界的
/**
* Creates a {@code LinkedBlockingQueue} with a capacity of
* {@link Integer#MAX_VALUE}.
*/
public LinkedBlockingQueue() {
this(Integer.MAX_VALUE);
}
构造函数时 给的是:Integer.MAX_VALUE 这个值 很大很大对吧 哈哈
SynchronousQueue 没有容量的队列
队列有个特点 就是不允许有空元素在队列中
那些线程池用到了这些工作队列
上代码
public static ExecutorService newFixedThreadPool(int nThreads) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>());
}
public static ExecutorService newWorkStealingPool(int parallelism) {
return new ForkJoinPool
(parallelism,
ForkJoinPool.defaultForkJoinWorkerThreadFactory,
null, true);
}
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) {
return new ThreadPoolExecutor(nThreads, nThreads,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>(),
threadFactory);
}
public static ExecutorService newSingleThreadExecutor() {
return new FinalizableDelegatedExecutorService
(new ThreadPoolExecutor(1, 1,
0L, TimeUnit.MILLISECONDS,
new LinkedBlockingQueue<Runnable>()));
}
public static ExecutorService newCachedThreadPool() {
return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
60L, TimeUnit.SECONDS,
new SynchronousQueue<Runnable>());
}
下一篇我们去运行并分析他 这些线程池 有那些弊端
在自己创建线程池的时候 合理选择工作队列
拒绝策略
当线程池workQueue已满且无法再创建新线程池时,就要拒绝后续任务了。拒绝策略需要实现RejectedExecutionHandler接口,不过Executors框架已经为我们实现了4种拒绝策略。
- AbortPolicy(默认):丢弃任务并抛出RejectedExecutionException异常。
- CallerRunsPolicy:直接运行这个任务的run方法,但并非是由线程池的线程处理,而是交由任务的调用线程处理。
- DiscardPolicy:直接丢弃任务,不抛出任何异常。
- DiscardOldestPolicy:将当前处于等待队列列头的等待任务强行取出,然后再试图将当前被拒绝的任务提交到线程池执行。
- 我知道自己写的文章比较烂,我的个人笔记,加深印象,最后我会给他合并到一起 持续更新