线程池

线程池ThreadPoolExecutor

几个重要角色
  • Thread 线程;
  • ThreadFactory 线程工厂,创建Thread;
  • Worker,Thread真正运行的Runnable;
  • BlockingQueue,阻塞队列,当核心线程数无空闲时,用户任务入队等待;
  • RejectedExecutionHandler 当等待队列已满且线程池无空闲时,由RejectedExecutionHandler来处理拒绝流程。

    以上角色关系示例图如下:
    threads_pool.png

    用户任务(Runnable)被线程池执行(execute)的流程:
    worker.png

工具类Executors

  • newSingleThreadExecutor
    corePoolSize=maximumPoolSize=1的线程池
  • newFixedThreadPool
    corePoolSize=maximumPoolSize=n(n>=1)的线程池
注:newSingleThreadExecutor()≠newFixedThreadPool(1),因为通过newFixedThreadPool(1)创建的线程池可以重新设置并发线程数,而newSingleThreadExecutor()创建出来的线程池无法改变并发线程数,只能是单线程。
  • newCachedThreadPool
    核心线程数0,最大线程数Integer.MAX_VALUE,线程保活时间60秒的线程池。官方注释其适用于大量short-lived任务。
    下图说明其工作机制(假设用户任务耗时30秒):
    1.用户于00:00、00:15提交两个30秒的任务,两个Worker并发执行:


    CachedThreadPool1.png
  1. 00:30之后,Worker1空闲,用户于00:40 提交任务Task3,交由Worker1执行


    CachedThreadPool2.png
  2. 00:45-01:45没有新任务进入,Worker2等待超时,线程终止:


    CachedThreadPool3.png
  3. 01:50、02:00用户依次提交两个任务Task4、Task5,Worker1仍存活,执行Task4,由于Worker2终止,新建Worker3执行Task5:


    CachedThreadPool4.png

你可能感兴趣的:(线程池)