源码中7大参数位置:
七大参数:
拒绝请求执行的runnable的策略。
理解图:
1. corePoolSize线程池中的常驻核心线程数
3. keepAliveTime多余的线程存活
核心线程满了,阻塞队列也满了,才会开启max最大线程数,如果还是满了,就会启动拒绝策略。如果流量降下来,就按照设置的时间最大数,慢慢的回到了核心线程数。
原理:
注意:阿里巴巴规范
拒绝策略:
public class ThreadPoolDemo {
public static void main(String[] args) {
ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(
2,
5,
1L,
TimeUnit.SECONDS,
new LinkedBlockingQueue<Runnable>(3),
Executors.defaultThreadFactory(),
new ThreadPoolExecutor.AbortPolicy());
try {
for (int i = 0; i < 8; i++) {
threadPoolExecutor.execute(() ->{
System.out.println(Thread.currentThread().getName()+"-办理业务");
});
}
}catch (Exception e){
e.printStackTrace();
}finally {
threadPoolExecutor.shutdown();
}
}
}
刚好满足8位个来办理业务
pool-1-thread-1-办理业务
pool-1-thread-1-办理业务
pool-1-thread-1-办理业务
pool-1-thread-2-办理业务
pool-1-thread-1-办理业务
pool-1-thread-3-办理业务
pool-1-thread-5-办理业务
pool-1-thread-4-办理业务
如果9位的话,new ThreadPoolExecutor.AbortPolicy()可能会报错
pool-1-thread-1-办理业务
pool-1-thread-5-办理业务
pool-1-thread-4-办理业务
pool-1-thread-3-办理业务
pool-1-thread-2-办理业务
pool-1-thread-4-办理业务
pool-1-thread-5-办理业务
pool-1-thread-1-办理业务
java.util.concurrent.RejectedExecutionException: Task com.example.mybatisplus.threadpool.ThreadPoolDemo$$Lambda$1/1604839423@619a5dff rejected from java.util.concurrent.ThreadPoolExecutor@1ed6993a[Running, pool size = 5, active threads = 5, queued tasks = 0, completed tasks = 3]
at java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution(ThreadPoolExecutor.java:2063)
at java.util.concurrent.ThreadPoolExecutor.reject(ThreadPoolExecutor.java:830)
at java.util.concurrent.ThreadPoolExecutor.execute(ThreadPoolExecutor.java:1379)
at com.example.mybatisplus.threadpool.ThreadPoolDemo.main(ThreadPoolDemo.java:17)
一 默认AbortPolicy()拒绝策略
new ThreadPoolExecutor.AbortPolicy()拒绝策略,如果任务数>(列队大小+maxsize 最大数)就会报错。
二 CallerRunsPolicy拒绝策略
pool-1-thread-1-办理业务
pool-1-thread-3-办理业务
main-办理业务
pool-1-thread-2-办理业务
pool-1-thread-3-办理业务
pool-1-thread-4-办理业务
pool-1-thread-1-办理业务
pool-1-thread-5-办理业务
pool-1-thread-2-办理业务
main线程调用,也参与进来调用。
三 DiscardOldestPolicy拒绝策略
pool-1-thread-1-办理业务
pool-1-thread-3-办理业务
pool-1-thread-4-办理业务
pool-1-thread-2-办理业务
pool-1-thread-4-办理业务
pool-1-thread-5-办理业务
pool-1-thread-3-办理业务
pool-1-thread-1-办理业务
10个任务,抛弃等待最久的任务。只执行(列队大小+maxsize 最大数)任务数例子为8个,所以只执行8个任务。
四 DiscardPolicy拒绝策略
pool-1-thread-1-办理业务
pool-1-thread-3-办理业务
pool-1-thread-2-办理业务
pool-1-thread-4-办理业务
pool-1-thread-3-办理业务
pool-1-thread-1-办理业务
pool-1-thread-2-办理业务
pool-1-thread-5-办理业务
10个任务,直接丢弃2个参数。只执行(列队大小+maxsize 最大数)任务数例子为8个,所以只执行8个任务。
如何合理配置线程池数?
查看cpu核数
System.out.println(Runtime.getRuntime().availableProcessors());
首先看看硬件,linux是几核的。
cpu密集型
io密集型
8/(1-0.9)=80