线程池任务添加流程

一个任务进来,如果核心线程未满,则创建核心线程来执行,如果核心线程已满则放到阻塞队列中,如果阻塞队列已满未达到最大线程数,则创建非核心线程来处理任务,如果达到最大线程数则拒绝任务。

ExecutorService 提供了两种提交任务的方法:

  1. execute():提交不需要返回值的任务
  2. submit():提交需要返回值的任务

有两个方法关闭线程池:

  1. `shutdown() 
    • 将线程池的状态设置为 SHUTDOWN,然后中断所有没有正在执行的线程
  2. shutdownNow() 
    • 将线程池设置为 STOP,然后尝试停止所有线程,并返回等待执行任务的列表

它们的共同点是:都是通过遍历线程池中的工作线程,逐个调用 Thread.interrup() 来中断线程,所以一些无法响应中断的任务可能永远无法停止(比如 Runnable)。

java.uitl.concurrent.ThreadPoolExecutor类是线程池中最核心的一个类

四种构造线程池的区别就在于拒绝任务策略:

  1. ThreadPoolExecutor.AbortPolicy:丢弃任务并抛出RejectedExecutionException异常。   
  2. ThreadPoolExecutor.DiscardPolicy:也是丢弃任务,但是不抛出异常。   
  3. ThreadPoolExecutor.DiscardOldestPolicy:丢弃队列最前面的任务,然后重新尝试执行任务(重复此过程)  
  4. ThreadPoolExecutor.CallerRunsPolicy:由调用线程处理该任务  

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页