我有一个运行一些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()中创建的线程休眠了几秒钟以进行测试,以便队列备份。
答案 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)
);
并且异常被正确抛出。