为什么Executors.newCachedThreadPool在提交过程中抛出java.util.concurrent.RejectedExecutionException

kzmpq1sx  于 2023-06-28  发布在  Java
关注(0)|答案(3)|浏览(111)

在这个测试场景中,提交的任务(线程)数量也不多。

cuxqih21

cuxqih211#

您需要提供如何在池上示例化和调用submit的代码示例(这里IP应该不是问题,因为我们不需要Callable类的内部细节或类似的东西)。
根据您提供的信息,您几乎肯定会在向executor服务提交可调用对象之前在某处关闭它。检查您是否调用了shutdownshutdownNow,如果是,请确保在此之后没有添加任务。
除此之外,您可能希望注册自己的java.util.concurrent.RejectedExecutionHandler实现,以帮助调试;每当执行器无法接受任务时,就会调用它的rejectedExecution消息,因此您可以在那里放置一些基本的状态检查逻辑来帮助您找到原因。

68bkxrlz

68bkxrlz2#

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

  • 当在ThreadPoolExecutor上调用execute()并且已达到最大池大小时。
  • 当在ThreadPoolExecutor上调用execute()时,同时调用shutdownNow,并且基本上失去了与shutdownNow调用的竞争。
  • 在executor关闭后,尝试调度ScheduledThreadPoolExecutor中的runnable的执行时。
l3zydbqr

l3zydbqr3#

下面是导致异常的示例代码:

ThreadPoolExecutor es = (ThreadPoolExecutor) Executors.newCachedThreadPool();
es.setCorePoolSize(2);    
es.setMaximumPoolSize(4); 
es.setKeepAliveTime(30, TimeUnit.SECONDS); 
es.submit(runnableTask);
es.submit(runnableTask);
es.submit(runnableTask);
es.submit(callableTask);
es.submit(callableTask); // ===> RejectedExecutionException
es.shutdown(); // is not executed because of the exception before

其他执行人服务,即Executors.newFixedThreadPool(2),是提交的任务被排队并稍后执行,但不抛出任何异常。Executors.newCachedThreadPool()在提交的任务数超过max时抛出异常有什么特别之处?

相关问题