转载

ThreadPoolExecutor 学习笔记

ThreadPoolExecutor

使用

构造函数

ThreadPoolExecutor(
int corePoolSize, 
int maximumPoolSize, 
long keepAliveTime, 
TimeUnit unit, 
BlockingQueue<Runnable> workQueue, 
ThreadFactory threadFactory, 
RejectedExecutionHandler handler)

corePoolSize 核心线程池大小

maximumPoolSize 最大线程池大小

keepAliveTime 当线程池大小大于corePoolSize时空闲线程最大的等待时间

workQueue 任务队列,是实现各种特性的线程池的关键

threadFactory 线程工厂类

RejectedExecutionHandler 当任务量超过线程池的处理能力时(任务队列满)的拒绝任务的策略

核心方法

提交任务

public void execute(Runnable command)

关闭线程池,等待任务队列中所有的任务执行完成,不能往线程池中添加新的任务,否则执行RejectedExecutionHandler

public void shutdown()

尝试停止正在执行的任务(调用interrupt方法,是否停止取决于线程是否响应该方法),并将等待执行的任务装入List返回给调用者

public List<Runnable> shutdownNow()

当前线程阻塞,直到

  • 等所有已提交的任务(包括正在跑的和队列中等待的)执行完
  • 或者等超时时间到
  • 或者线程被中断,抛出InterruptedException
public boolean awaitTermination(long timeout,
                                TimeUnit unit)
                         throws InterruptedException

从任务队列中移除相应的任务,在该任务没有被执行的情况下

public boolean remove(Runnable task)

以下两个方法需要通过继承ThreadPoolExecutor来实现

protected void beforeExecute(Thread t,
                             Runnable r)
protected void afterExecute(Runnable r,
                            Throwable t)

任务拒绝策略

public interface RejectedExecutionHandler{
    void rejectedExecution(Runnable r,
                       ThreadPoolExecutor executor)
}

所有已知的实现类

  • ThreadPoolExecutor.AbortPolicy 默认使用的拒绝策略,如果有要执行的任务队列已满,且还有任务提交,则直接抛出异常信息
  • ThreadPoolExecutor.CallerRunsPolicy 如果线程池未关闭,一个任务被拒绝执行则直接在调用者线程执行任务的run方法
  • ThreadPoolExecutor.DiscardOldestPolicy 忽略最早提交的任务.如果有要执行的任务队列已满,此时若还有任务提交且线程池还没有停止,则把队列中最早提交的任务抛弃掉,然后把当前任务加入队列中
  • ThreadPoolExecutor.DiscardPolicy 如果有要执行的任务队列已满,且还有任务提交,则直接忽略掉这个任务,即不抛出异常也不做任何处理.
原文  https://www.linuxidc.com/Linux/2019-11/161328.htm
正文到此结束
Loading...