RejectedExecutionException不会立即抛出?

时间:2016-09-07 21:42:56

标签: java

我有一个运行一些runnables的执行程序:

ThreadPoolExecutor pool = new ThreadPoolExecutor(
                    5, 
                    15, 
                    15000, 
                    TimeUnit.MILLISECONDS, 
                    new ArrayBlockingQueue<Runnable>(100)
                );

            try{
                for(int i = 0; i<=300; i++){
                        Logger.info("Queue size:{}", pool.getQueue().size());
                        pool.execute(new Runnable(){
                            @Override
                            public void run() {
                              object.method()
                            }               
                        });
                }
            }
            catch(RejectedExecutionException e){
                Logger.error(e.getMessage());
            }

但是,在抛出RejectedExecutionException之前,队列处于100次迭代。输出为&#34;队列大小:100&#34;在抛出异常之前大约11次。查看文档,当队列大小达到其限制时,应该抛出该异常。有什么想法,它为什么不立即抛出异常?

编辑:也就是说我在run()中创建的线程休眠了几秒钟以进行测试,以便队列备份。

1 个答案:

答案 0 :(得分:0)

想出来了。问题是我将maxPoolSize设置为15,corePool为5.当5忙时,任务被添加到队列中。当队列填满时,会创建更多线程(最多为maxPoolSize)。所以我的队列仍然是满的,然后创建了线程。我改变了

ThreadPoolExecutor pool = new ThreadPoolExecutor(
                5, 
                15, 
                15000, 
                TimeUnit.MILLISECONDS, 
                new ArrayBlockingQueue<Runnable>(100)
            );

为:

ThreadPoolExecutor pool = new ThreadPoolExecutor(
                15, 
                15, 
                15000, 
                TimeUnit.MILLISECONDS, 
                new ArrayBlockingQueue<Runnable>(100)
            );

并且异常被正确抛出。