1. ThreadPoolExecutor executor = new ThreadPoolExecutor(2,3,1, TimeUnit.SECONDS,new LinkedBlockingDeque<>(2),namedThreadFactory,new ThreadPoolExecutor.AbortPolicy());
    2. @RequestMapping("/submitJob")
    3. public void submitJob(){
    4. executor.execute(new Runnable() {
    5. @Override
    6. public void run() {
    7. try {
    8. System.out.println(Thread.currentThread().getName()+"starting ");
    9. TimeUnit.HOURS.sleep(5);
    10. System.out.println(Thread.currentThread().getName()+"ending");
    11. } catch (InterruptedException e) {
    12. e.printStackTrace();
    13. }
    14. }
    15. });
    16. }
    17. @RequestMapping("/submitJob2")
    18. public void submitJob2(){
    19. executor.execute(new Runnable() {
    20. @Override
    21. public void run() {
    22. try {
    23. System.out.println(Thread.currentThread().getName()+"starting ");
    24. TimeUnit.SECONDS.sleep(5);
    25. } catch (InterruptedException e) {
    26. e.printStackTrace();
    27. }
    28. System.out.println(Thread.currentThread().getName()+"ending");
    29. }
    30. });
    31. }

    我们可以看到coreSize是2,maxSize是3,timeout是1s,queue的size是2,拒绝策略是abort

    提交第一个任务时,线程池创建第一个线程
    提交第二个任务时,不管第一个核心线程有没有执行完,都会创建第二个核心线程池
    提交第三个任务时,如果两个核心都空闲,则用核心线程执行任务,否则加入blockQueue
    提交第四个任务时,如果两个核心都在满,那么继续加入BlockQueue
    提交第五个任务时,创建maxSize-coreSize其中的一个线程,执行第五个任务,执行完,会触发如果timeout没有新的任务,就销毁这个线程。
    提交第六个线程,如果都满,那么执行拒绝策略,这边是拒绝策略。当然也可以其他策略