ExecutorService.shutdownNow()将变量设置为null

时间:2012-11-19 18:34:30

标签: java multithreading runnable executorservice

我正在使用

创建ExecutorService
ExecutorService executor = Executors.newFixedThreadPool(5);

我添加Runnables

executor.execute(runnable)

我有一个java.sql.Connection实例,它在runnable实现的某个地方创建,并在finally语句中关闭。

这在我致电executor.shutdownNow()之前完美无缺。当我这样做时,连接的值为null,即检查员看到connection = null。 如果我使用shutdown()方法停止执行程序,一切都会完美无缺。

我一直在搜索和阅读(甚至java的源代码),但无法理解可能导致此问题的原因。

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

1 个答案:

答案 0 :(得分:0)

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


如果您使用ThreadPoolExecutor,则可以调用shutdown(),获取作业队列并将其耗尽,这样就不会接受新作业,旧作业将从队列中删除。然后你可以等待终止当前的工作。