线程池
创建线程池
* 1).Executors
* 2).new ThreadPoolExecutor()
线程池七大参数:
* 1.corePoolSize:核心线程数【一直存在,除非设置超时时间(allowCoreThreadTimeOut)】,
* 线程池创建好之后就绪的线程数
* 2.maximumPoolSize:最大线程数
* 3.keepAliveTime:空闲线程(maximumPoolSize-corePoolSize)存活时间
* 4.unit:时间单位
* 5.BlockingQueue<Runnable> workQueue:阻塞队列,任务多于core线程时,多于的任务放入
* 队列中,空闲的线程从队列中获取任务执行
* 6.ThreadFactory threadFactory:线程工厂
* 7.RejectedExecutionHandler handler:当阻塞队列满了之后,多余任务的执行策略
运行流程:
* 1、线程池创建,准备好 core 数量的核心线程,准备接受任务
* 2、新的任务进来,用 core 准备好的空闲线程执行。
* (1) 、core 满了,就将再进来的任务放入阻塞队列中。空闲的 core 就会自己去阻塞队
* 列获取任务执行
* (2) 、阻塞队列满了,就直接开新线程执行,最大只能开到 max 指定的数量
* (3) 、max 都执行好了。Max-core 数量空闲的线程会在 keepAliveTime 指定的时间后自
* 动销毁。最终保持到 core 大小
* (4) 、如果线程数开到了 max 的数量,还有新任务进来,就会使用 reject 指定的拒绝策
* 略进行处理
* 3、所有的线程创建都是由指定的 factory 创建的。
面试:
* 一个线程池 core 7; max 20 ,queue:50,100 并发进来怎么分配的:
* 先有 7 个能直接得到执行,接下来 50 个进入队列排队,在多开 13 个继续执行。现在 70 个
* 被安排上了。剩下 30 个默认拒绝策略。
new ThreadPoolExecutor(
10,
200,
10,
TimeUnit.SECONDS,
new LinkedBlockingQueue<>(100000),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy()
);