面试今典-Java中线程池-工作队列workQueue

124 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第2天,点击查看活动详情

工作队列

  • 主要是对任务的一个缓冲层

首先看一下 父接口

image.png

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 这个值 很大很大对吧 哈哈

image.png

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种拒绝策略。

  1. AbortPolicy(默认):丢弃任务并抛出RejectedExecutionException异常。
  2. CallerRunsPolicy:直接运行这个任务的run方法,但并非是由线程池的线程处理,而是交由任务的调用线程处理。
  3. DiscardPolicy:直接丢弃任务,不抛出任何异常。
  4. DiscardOldestPolicy:将当前处于等待队列列头的等待任务强行取出,然后再试图将当前被拒绝的任务提交到线程池执行。
  • 我知道自己写的文章比较烂,我的个人笔记,加深印象,最后我会给他合并到一起 持续更新