java并发编程-JUC之ThreadPoolExecutor

    ThreadPoolExecutor类是线程池中最核心的类,不提倡直接使用,最好是使用Executors类中提供的静态方法来创建线程池。ThreadPoolExecutor继承AbstractExecutorService类,即ThreadPoolExecutor中能够调用ExecutorService的方法。ThreadPoolExecutor中主要方法有:execute(Runnable),submit(Callable),shutdown(),shutdownNow()等,submit底层是调用execute。

1.线程池参数:

corePoolSize :
     核心线程数,如果当前运行线程小于核心线程数(corePoolSize),即使当前有空闲线程,也会新建一个线程来处理新提交的任务。

maximumPoolSize:
     最大线程数,当前运行线程数大于核心线程数(corePoolSize)并小于最大线程数,只有当等待队列已满的情况下才会新建线程。

workQueue:
    等待队列,主要是用来暂存已提交的任务。

private final BlockingQueue workQueue;

     如果运行线程数小于corePoolSize,提交新任务时就会新建一个线程来运行;如果运行线程数大于或等于corePoolSize,新提交的任务就会入列等待;如果队列已满,并且运行线程数小于maximumPoolSize,也将会新建一个线程来运行;如果线程数大于maximumPoolSize,新提交的任务将会根据拒绝策略来处理。

拒绝策略:

  • AbortPolicy:默认策略,在需要拒绝任务时抛出RejectedExecutionException;
  • CallerRunsPolicy:直接在 execute 方法的调用线程中运行被拒绝的任务,如果线程池已经关闭,任务将被丢弃;
  • DiscardPolicy:直接丢弃任务;
  • DiscardOldestPolicy:丢弃队列中等待时间最长的任务,并执行当前提交的任务,如果线程池已经关闭,任务将被丢弃

2.线程池状态:

    ThreadPoolExecutor 通过一个 int 型参数 ctl 来控制池状态,使用低29位表示线程池中的线程数,高3位表示线程池的运行状态,jdk对应的源码如下图,感兴趣的可以自行研究其中的位运算。
java并发编程-JUC之ThreadPoolExecutor_第1张图片
分析源码可得,线程池总共有如下几种状态:

  • RUNNING:可以接收新的任务和队列任务
  • SHUTDOWN:不接收新的任务,但是会运行队列任务
  • STOP:不接收新任务,也不会运行队列任务,并且中断正在运行的任务
  • TIDYING:所有任务都已经终止,workerCount为0,当池状态为TIDYING时将会运行terminated()方法
  • TERMINATED:terminated函数完成执行

你可能感兴趣的:(java基础)