线程池

参数 意义
corePoolsize 线程池核心线程数
workQueue 存放提交的task
maximumPoolSize 线程池中允许最大线程数
threalFactory 线程工厂,用于创建线程,由Excutors#defultThrealFactory实现
keepAliveTime 空闲线程存活时间(默认是临时线程,也可设置为核心线程)
unit 空闲时间线程存活时间单位枚举

线程池流程

1.当workers.size()小于corePoolSize时, 创建新的线程执行提交的task

2.当workers.size()大于corePoolSize时, 并且workQueue没有满将task添加到workQueue.

3.当workers.size()大于corePoolSize时,并且workQueue已经满了,workers.size()<maximumPoolSize,就创建一个临时线程处理task

4.当workers.size()大于corePoolSize时, 并且workQueue已经满了, 并且workers.size()>=maximumPoolSize, 执行拒绝策略

4种默认的拒绝策略:
ThreadPoolExecutor默认实现的4种拒绝策略.

  • AbortPolicy -- 当任务添加到线程池中被拒绝时,它将抛出 RejectedExecutionException 异常。
  • CallerRunsPolicy -- 当任务添加到线程池中被拒绝时,会在线程池当前正在运行的Thread线程池中处理被拒绝的任务。
  • DiscardOldestPolicy -- 当任务添加到线程池中被拒绝时,线程池会放弃等待队列中最旧的未处理任务,然后将被拒绝的任务添加到等待队列中。
  • DiscardPolicy -- 当任务添加到线程池中被拒绝时,线程池将丢弃被拒绝的任务。

预定义线程池4种线程池

ThreadPoolExecutor提供了四个构造方法:


image
  • FixedThreadPool 固定大小的线程池
private final ExecutorService executorService = new ThreadPoolExecutor(10, 50,
        60L, TimeUnit.SECONDS,
        new LinkedBlockingQueue<Runnable>(), new ThreadFactoryBuilder()
        .build(), new ThreadPoolExecutor.AbortPolicy());

适用场景:可用于Web服务瞬时削峰,但需注意长时间持续高峰情况造成的队列阻塞。

  • CachedThreadPool 可缓存线程池
   public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
    }

适用场景:快速处理大量耗时较短的任务,如Netty的NIO接受请求时,可使用CachedThreadPool。

  • SingleThreadExecutor 单例线程池
  public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
    }

适用场景:创建一个单线程的线程池,适用于需要保证顺序执行各个任务。

  • ScheduledThreadPool 调度线程池

内容比较多 可自行度娘

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。