Java 线程池 ThreadPoolExecutor

线程池有哪些好处?

  • 重复使用线程资源,减少创建和销毁的频率,从而减少性能损耗.
  • 重复使用线程资源,减少由于代码问题,造成线程大量创建,资源耗费.
  • 便于维护(1、维护线程状态 2、维护任务状态 3、维护线程变量)
线程池介绍
thread-pool-intruduce

ThreadPoolExecutor 有哪些状态?

  • RUNNING:接收新任务,同时处理阻塞队列中的任务
  • SHUTDOWN:不接收新任务,但是处理阻塞队列中的任务
  • STOP:不接收新任务,不处理阻塞队列中的任务,中断正在处理的任务
  • TIDYING:当所有任务执行完,当前线程池已经没有工作线程,这时线程池状态为 TIDYING 状态,同时调用 TERMINATED 方法
  • TERMINATED:调用 TERMINATED 方法后,线程状态为 TERMINATED
线程池状态变量

ThreadPoolExecutor 如何管理状态?

通过 ThreadPoolExecutor 内部原子变量 ctl 来进行线程状态管理

线程池状态管理

ThreadPoolExecutor 如何维护线程?

通过 ThreadPoolExecutor 内部类 Worker 封装线程 Thread 信息,并通过方法 runWorker() -> getTask() 来对线程进行维护

线程池内部类 Worker
ThreadPoolExecutor 如何提交任务?

通过 ThreadPoolExecutor 内部方法 execute(Runnable) 来进行提交任务

线程池提交任务
线程池提交任务流程

注意事项:

  1. 阅读源码顺序:继承关系 -> 变量 -> 内部类 -> 方法.

  2. BlockQueue -> ArrayBlockQueue 阻塞队列:

  • poll 方法在队列为空时,将返回 null,不为空清除并返回元素

    队列 poll 方法
  • take 方法在队列为空时,将会阻塞,只要队列中有任务可以被取出

    队列 take 阻塞
  • offer 方法在队列满时,将返回 false,队列没满时将元素加入队列,同时唤醒阻塞的队列,并返回 true

    队列 offer 方法
  • put 方法在队列满时,将会阻塞队列,队列没满时将元素加入队列,同时唤醒阻塞的队列

    队列 put 方法


java     

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!