ThreadPoolExecutor executor = new ThreadPoolExecutor(2,3,1, TimeUnit.SECONDS,new LinkedBlockingDeque<>(2),namedThreadFactory,new ThreadPoolExecutor.AbortPolicy());
@RequestMapping("/submitJob")
public void submitJob(){
executor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"starting ");
TimeUnit.HOURS.sleep(5);
System.out.println(Thread.currentThread().getName()+"ending");
} catch (InterruptedException e) {
e.printStackTrace();
}
}
});
}
@RequestMapping("/submitJob2")
public void submitJob2(){
executor.execute(new Runnable() {
@Override
public void run() {
try {
System.out.println(Thread.currentThread().getName()+"starting ");
TimeUnit.SECONDS.sleep(5);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println(Thread.currentThread().getName()+"ending");
}
});
}
我们可以看到coreSize是2,maxSize是3,timeout是1s,queue的size是2,拒绝策略是abort
提交第一个任务时,线程池创建第一个线程
提交第二个任务时,不管第一个核心线程有没有执行完,都会创建第二个核心线程池
提交第三个任务时,如果两个核心都空闲,则用核心线程执行任务,否则加入blockQueue
提交第四个任务时,如果两个核心都在满,那么继续加入BlockQueue
提交第五个任务时,创建maxSize-coreSize其中的一个线程,执行第五个任务,执行完,会触发如果timeout没有新的任务,就销毁这个线程。
提交第六个线程,如果都满,那么执行拒绝策略,这边是拒绝策略。当然也可以其他策略