当前位置 博文首页 > 程序员石磊:使用ThreadPoolExecutor,当提交线程超过maximumPoo

    程序员石磊:使用ThreadPoolExecutor,当提交线程超过maximumPoo

    作者:[db:作者] 时间:2021-08-08 19:23

    今天开会同事说使用线程池,当提交的子线程超过运行的最大线程数,会阻塞主线程,然后我就回复 有拒绝策略,会抛出异常,同时也要确认当线程池满的时候executor.execute方法会不会是阻塞的了,其实内心是不认可这个观点的。不轻信别人,谨慎求证,直接上测试代码

    import java.util.concurrent.ArrayBlockingQueue;
    import java.util.concurrent.ThreadPoolExecutor;
    import java.util.concurrent.TimeUnit;
    
    
    public class ThreadPoolTest {
        public static void main(String[] args) {
            ThreadPoolExecutor executor = new ThreadPoolExecutor(5, 10, 200, TimeUnit.MILLISECONDS,
                    new ArrayBlockingQueue<Runnable>(5));
            long a = 0;
            for(int i=0;i<500;i++){
                MyTask myTask = new MyTask(i);
                try{
                    a= System.currentTimeMillis();
                    executor.execute(myTask);
                }catch (Exception e){
                    e.printStackTrace();
                }finally {
                    long b = System.currentTimeMillis()-a;
                    System.out.println("线程提交时间间隔"+b);
                }
            }
            executor.shutdown();
        }
       static class MyTask implements Runnable {
            private int taskNum;
    
            public MyTask(int num) {
                this.taskNum = num;
            }
            @Override
            public void run() {
                System.out.println("正在执行task "+taskNum);
                try {
                    Thread.currentThread().sleep(3000);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
                System.out.println("task "+taskNum+"执行完毕");
            }
        }
    }
    

    上述代码配置线程运行最大线程数量是10,启动500个线程,测试当线程池满的情况下,根据领导的说法,会阻塞,因此我就在 executor.execute(myTask); 前后加上开始时间和结束时间,看看他们的执行时间,到底是多少。最后测试结果如下:
    这里写图片描述

    出现了很多线程被拒绝的异常,但是大部分情况都是0毫秒。所以阻塞主线程的说法是错误的。

    cs