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
3条答案
按热度按时间cuxqih211#
您需要提供如何在池上示例化和调用
submit
的代码示例(这里IP应该不是问题,因为我们不需要Callable
类的内部细节或类似的东西)。根据您提供的信息,您几乎肯定会在向executor服务提交可调用对象之前在某处关闭它。检查您是否调用了
shutdown
或shutdownNow
,如果是,请确保在此之后没有添加任务。除此之外,您可能希望注册自己的
java.util.concurrent.RejectedExecutionHandler
实现,以帮助调试;每当执行器无法接受任务时,就会调用它的rejectedExecution消息,因此您可以在那里放置一些基本的状态检查逻辑来帮助您找到原因。68bkxrlz2#
在调用
Executors.newCachedThreadPool()
方法时,我没有看到任何地方抛出RejectedExecutionException
。在Java 6中只有三种情况会抛出:ThreadPoolExecutor
上调用execute()
并且已达到最大池大小时。ThreadPoolExecutor
上调用execute()
时,同时调用shutdownNow
,并且基本上失去了与shutdownNow
调用的竞争。ScheduledThreadPoolExecutor
中的runnable的执行时。l3zydbqr3#
下面是导致异常的示例代码:
其他执行人服务,即
Executors.newFixedThreadPool(2)
,是提交的任务被排队并稍后执行,但不抛出任何异常。Executors.newCachedThreadPool()
在提交的任务数超过max时抛出异常有什么特别之处?