ThreadPoolExecutor详解


1、java创建线程的几种方式
  • 继承Thread类
  • 实现Runnable接口
  • 实现Callable接口
  • 线程池
    • java.util.concurrent包下提供了Executors类可以去创建线程池(但不推荐这种方式创建,这种方式对线程池的控制粒度较低,如newFixedThreadPool方法中使用了无界队列(LinkedBlockingQueue),当一个请求进来之后,如果核心线程有空闲线程直接使用核心线程中的线程执行任务,不会添加到阻塞队列中,如果核心线程满了,新的任务会添加到阻塞队列,阻塞队列的容量过大。就会发生导致内存泄漏。 )
  • 推荐使用ThreadPoolExecutor创建线程池
2、线程池的七个参数
public ThreadPoolExecutor( int corePoolSize, //核心线程数
                           int maximumPoolSize, //最大线程数
                           long keepAliveTime, //最大空闲时间
                           TimeUnit unit, //时间单位
                           BlockingQueue<Runnable> workQueue, // 阻塞队列
                           ThreadFactory threadFactory, //线程工厂
                           RejectedExecutionHandler handler //线程策略
                         ) {
    					.....
					}
3、线程池的执行流程

4、线程池属性标识
//是一个int类型的数值,表达了两个意思,1:声明当前线程池的状态,2:声明线程池中的线程数
//高3位:线程池状态    低29位:线程池中的线程个数
private final AtomicInteger ctl = new AtomicInteger(ctlOf(RUNNING, 0));
private static final int COUNT_BITS = Integer.SIZE - 3;
private static final int CAPACITY   = (1 << COUNT_BITS) - 1;  //通过位运算得出最大容量

// runState is stored in the high-order bits
//高3位为111代表线程池运行状态
private static final int RUNNING    = -1 << COUNT_BITS;
//000代表线程池为SHUTDOWN状态,(不接受新任务,但是仍会运行阻塞队列的任务)
private static final int SHUTDOWN   =  0 << COUNT_BITS;
//001 代表线程池为STOP状态,不接收新任务,也不去处理阻塞队列中的任务,同时会中断正在执行的任务
private static final int STOP       =  1 << COUNT_BITS; 
// 010 代表线程池为TIDYING状态,过度的状态,代表当前线程池即将关闭
private static final int TIDYING    =  2 << COUNT_BITS; 
//100 代表线程池为TERMINATED,终结状态
private static final int TERMINATED=  3 << COUNT_BITS;


// Packing and unpacking ctl
private static int runStateOf(int c)     { return c & ~CAPACITY; } //得到当前线程的状态
private static int workerCountOf(int c)  { return c & CAPACITY; } //得到当前线程池的线程数量
5、线程池状态变化


文章作者: Fansboom
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Fansboom !
评论