2009-10-05 16 views
16

在这个测试场景中提交的任务(线程)数量也不是很大。为什么在提交期间Executors.newCachedThreadPool抛出java.util.concurrent.RejectedExecutionException

+2

您能否优化您的问题?例如。添加一个简短的测试用例。 – Kutzi 2009-10-05 12:19:07

+0

对不起,由于IP原因,我可以分享的代码不多。在坚果壳中,我打电话提交与Callable 类型。我正在寻找可能发生的情况。 – 2009-10-05 12:24:18

+1

你是说你没有看到特定的场景,而是想知道可能抛出异常的假设场景?如果是这样的话,你应该将问题从'为什么...'改为'何时...' – akf 2009-10-05 12:39:58

回答

30

你需要提供你如何实例代码示例和在泳池调用submit(IP应该是一个非问题这里我们不需要你的Callable类或任何类似的内部细节那)。

根据您提供的信息,您几乎可以肯定地关闭执行程序服务,然后将可执行程序提交给它。请检查您是否拨打shutdownshutdownNow,如果是,请确保您在此之后不添加任务。

除此之外,您可能希望注册您自己的java.util.concurrent.RejectedExecutionHandler实现,以帮助调试;它的rejectedExecution消息将在执行程序无法接受任务时调用,因此您可以在其中放入一些基本的状态检查逻辑以帮助您找到原因。

+0

你是对的;我找到了关闭执行程序池的代码;谢谢 – 2009-10-05 13:26:44

25

我没有看到任何地方调用Executors.newCachedThreadPool()方法,其中RejectedExecutionException抛出。只有三种情况下,它出现在Java 6中被抛出:

呼吁一个 ThreadPoolExecutor和最大池大小​​时
  • 已经达到。
  • 当在ThreadPoolExecutor上调用​​时,shutdownNow,并且基本上已经与shutdownNow呼叫失去了竞赛。
  • 在执行程序关闭后尝试安排执行ScheduledThreadPoolExecutor中的可运行程序时。
+4

+1列出所有可能的案例 – 2011-06-15 17:04:10

相关问题