7个线程池参数:
- corePoolsize:线程池中的常驻核心线程数
当线程池中的线程数目达到 corePoolsize 后,就会把任务放到缓存队列中- maximumPoolsize:线程池中能够容纳同时执行的最大线程数
此值必须大于等于1- keepAliveTime:多余的空闲线程的存活时间。
当线程池数量超过corePoolsize时,当空闲时间达到keepAliveTime值时,多余空闲线程会被销直到只剩下corePoolsize个线程为止- unit:keepAliveTime的单位
- threadFactor:表示生成线程池中工作线程的线程工厂
用于创建线程一般用默认即可- handler:拒绝策略
表示当队列满了并且工作线程大于等于线程池的最大线程数
AboutPolicy:默认,直接抛出异常阻止系统正常运行
CallerRunsPolicy:“调用者运行”一种调节机制,即不抛弃任务,也不会抛出异常,而是将某些任务回退到调用者
DiscardOldestPolicy:抛弃队列中等待最久的线程,然后把当前任务加入队列中尝试再次提交任务
DiscardPolicy:直接抛弃任务,不予任何处理也不抛出异常。如果允许任务丢失,这是最好的方案
以上策略均实现了RejectedExecutionHandler接口
线程池不允许使用Executors去创建,而是通过ThreadPoolExecutor的方式创建
原因:
- FixthreadPool和SingleThreadPool:允许请求队列长度为Integer.MAX_VALUE,可能会堆积大量的请求,从而导致OOM
- CaChwsThreadPool和ScheduledThreadPool:允许创建的线程数量为Integer.MAX_VALUE,可能会创建大量的线程,从而导致OOM
自定义线程池
import java.util.concurrent.*;
/**
* 自定义线程池
*/
public class MyThreadPoolDemo02 {
public static void main(String[] args) {
ExecutorService threadPool = new ThreadPoolExecutor(2,5,1L,
TimeUnit.SECONDS,
new LinkedBlockingDeque<Runnable>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.DiscardPolicy());
try {
for (int i = 1;i<=20;i++) {
threadPool.execute(() -> {
System.out.println(Thread.currentThread().getName()+"\t 办理业务");
});
// TimeUnit.MILLISECONDS.sleep(200);
}
}catch (Exception e){
e.printStackTrace();
}finally {
threadPool.shutdown();
}
}
}