ThreadPoolExecutor

1、Java构建线程方式

Java提供了Executors可以去创建(规范中不允许使用这种方式创建线程池,这种方式对线程的控制粒度比较低)。
推荐手动创建线程池
ThreadPoolExecutor_第1张图片

2、线程池的7个参数

/*@pamam1:核心线程数;@pamam2:最大线程数;@pamam3:保持空闲时间;@pamam4:时间单位;@pamam5:阻塞队列;@pamam6:线程工厂(可以为线程设置线程名称);@pamam7:拒绝策略;*/
 public ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler) {
        this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
             Executors.defaultThreadFactory(), defaultHandler);
    }

3、线程池的执行流程

ThreadPoolExecutor_第2张图片

首先将线程任务提交给线程池执行,如果核心线程有空闲则执行任务,如果没有空闲则将多出的任务放到阻塞队列。阻塞队列没有满则任务在队列中排队等待,如果阻塞队列满了则创建非核心线程。如果创建的非核心线程达到最大线程数则拒绝任务。
例子:顾客(任务)饭店(线程池)吃饭,此时厨房有两个厨子(核心线程数)顾客少两个厨子刚好能应对。随着客人的增多厨子应对不过来,客人只能去排队(阻塞队列)如果排队人数太多然后老板招厨子(创建非核心线程),当这些厨子还没办法应对客人,则将多出的客人拒绝。

4、线程池的属性标识

4.1、核心属性

ThreadPoolExecutor_第3张图片
ThreadPoolExecutor_第4张图片

4.2、线程池状态变化

ThreadPoolExecutor_第5张图片

5、线程池的excute方法执行

从execute方法开始
ThreadPoolExecutor_第6张图片

你可能感兴趣的:(java,jvm)