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() {@Overridepublic 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() {@Overridepublic 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没有新的任务,就销毁这个线程。
提交第六个线程,如果都满,那么执行拒绝策略,这边是拒绝策略。当然也可以其他策略
