一个任务进来,如果核心线程未满,则创建核心线程来执行,如果核心线程已满则放到阻塞队列中,如果阻塞队列已满未达到最大线程数,则创建非核心线程来处理任务,如果达到最大线程数则拒绝任务。
ExecutorService
提供了两种提交任务的方法:
execute()
:提交不需要返回值的任务submit()
:提交需要返回值的任务
有两个方法关闭线程池:
`shutdown()
- 将线程池的状态设置为 SHUTDOWN,然后中断所有没有正在执行的线程
shutdownNow()
- 将线程池设置为 STOP,然后尝试停止所有线程,并返回等待执行任务的列表
它们的共同点是:都是通过遍历线程池中的工作线程,逐个调用 Thread.interrup()
来中断线程,所以一些无法响应中断的任务可能永远无法停止(比如 Runnable
)。
java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类
四种构造线程池的区别就在于拒绝任务策略:
- ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。
- ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。
- ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)
- ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务