NiceLeeのBlog 用爱发电 bilibili~

Java 线程池笔记

2019-01-10
nIceLee

阅读:


Java线程池笔记

总结

  • 线程池核心为java.uitl.concurrent.ThreadPoolExecutor类,该类有几个构造函数,实际上调用的是一个,其参数的大致含义:
    • corePoolSize:核心池的大小
    • maximumPoolSize:线程池最大线程数
    • keepAliveTime:表示线程没有任务执行时最多保持多久时间会终止。
    • unit:参数keepAliveTime的时间单位
    • workQueue:一个阻塞队列,用来存储等待执行的任务
    • threadFactory:线程工厂,主要用来创建线程;
    • handler:表示当拒绝处理任务时的策略,有以下四种取值:
      ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。 ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。 ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
      ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务
  • 一般来说,提交一个任务,
    • 当前线程数小于corePoolSize,则新建线程来执行;
    • 大于corePoolSize,则放入队列workQueue
    • 队列满了以后,如果线程数小于maximumPoolSize,则新建线程来执行;
    • 大于maximumPoolSize,则根据拒绝处理任务时的策略处理。
  • 一般来说,当一个任务被线程执行完毕,
    • 当前若不为空闲,继续执行其他任务;
    • 若空闲keepAliveTime单位时间后,线程数大于corePoolSize,释放该线程;
    • 线程数小于corePoolSize,无特殊设置不处理;
  • Executors类中提供的几个静态方法来创建线程池,实际上也是调用了ThreadPoolExecutor
    • FixedThreadPool创建的线程池corePoolSize和maximumPoolSize值是相等的,它使用的LinkedBlockingQueue;
    • SingleThreadExecutor将corePoolSize和maximumPoolSize都设置为1,也使用的LinkedBlockingQueue;
    • CachedThreadPool将corePoolSize设置为0,将maximumPoolSize设置为Integer.MAX_VALUE,使用的SynchronousQueue,也就是说来了任务就创建线程运行,当线程空闲超过60秒,就销毁线程。

参考


内容
隐藏