我遇到了一个让我疯狂一段时间的问题,我需要咨询你的集体智慧。
我有一个ThreadPoolExecutor,其池为1,从Executors.newFixedThreadPool调用。我使用!isShutdown()保护所有executor.execute(),因为从另一个线程调用executor.shutdown(),因此应该能够说执行程序不会抛出RejectedExecutionException。然而,这就是我随机看到的。
有没有人知道为什么我会看到这种行为?
答案 0 :(得分:1)
您可以浏览一篇关于double-checked locking的文章,以了解如何/为什么不同步的“if then act”方法在java中不起作用。
出于好奇,你为什么还要检查这项工作是否会被拒绝?我不记得以前见过这件事。相反,为什么不捕获并处理抛出的任何RejectedExecutionExceptions?
还要注意如何处理其他错误情况,尤其是在调用shutdown时正在队列中运行或等待的任务。 Java Concurrency in Practice的第7章有很多关于此的信息。
答案 1 :(得分:0)
此处列出的http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html
还有其他原因导致被拒绝执行您的队列很可能达到了它的范围。