0

我正在创建一个ExecutorServicewith

ExecutorService executor = Executors.newFixedThreadPool(5);

Runnables加上

executor.execute(runnable)

我有一个java.sql.Connection在可运行实现内部某处创建并在finally语句中关闭的实例。

在我打电话之前,这非常有效executor.shutdownNow()。当我这样做时,连接将其值设为 null,即使用我看到的检查器connection = null。如果我用该方法停止执行程序,shutdown()一切都会完美运行。

我一直在搜索和阅读(甚至是 java 的源代码),但无法理解可能导致这种情况的原因。

我试图抓住一个,InterrupedException但显然没有被抛出

4

1 回答 1

0

由于我们对您不需要的副作用一无所知shutdownNow()...
通常, ashutdown()应该足以导致ExecutorService拒绝新作业并且工作线程完成队列中的剩余作业。shutdown()不幸的是, (这将使所有先前提交的作业完成)和shutdownNow()(它将尝试中断当前正在执行的作业)之间似乎存在差距。应该有一个中间shutdownAlmostNow()部分让 ES 完成他们当前的工作,但返回那些仍在等待的shutdownNow().


如果您使用 a ThreadPoolExecutor,您可以调用shutdown(),获取作业队列并将其排空,因此不会接受新作业并且旧作业会从队列中移除。然后你可以等待当前工作的终止。

于 2013-01-09T23:22:41.637 回答