我有一个问题让我发疯了一段时间,我需要咨询你的集体智慧。
我有一个池为 1 的 ThreadPoolExecutor,从 Executors.newFixedThreadPool 调用。我用 !isShutdown() 保护所有 executor.execute(),因为 executor.shutdown() 是从另一个线程调用的,因此应该可以说 executor 不会抛出 RejectedExecutionException。不过,这是我随机看到的。
有谁知道为什么我会看到这种行为?
您可能会阅读有关双重检查锁定的文章,以了解不同步的“if then act”方法如何/为什么在 java 中不起作用。
出于好奇,您为什么要费心检查作品是否会被拒绝?我不记得以前看过这个。相反,为什么不捕获并处理任何抛出的 RejectedExecutionExceptions?
还要注意如何处理其他错误情况,尤其是在调用 shutdown 时正在运行或在队列中等待的任务。Java Concurrency in Practice 的第 7 章对此有很多很好的信息。
此处详细说明了拒绝执行的其他原因http://download.oracle.com/javase/1,5.0/docs/api/java/util/concurrent/ThreadPoolExecutor.html
您的队列很可能已达到其界限。