我正在使用
创建ExecutorService
ExecutorService executor = Executors.newFixedThreadPool(5);
我添加Runnables
和
executor.execute(runnable)
我有一个java.sql.Connection
实例,它在runnable实现的某个地方创建,并在finally
语句中关闭。
这在我致电executor.shutdownNow()
之前完美无缺。当我这样做时,连接的值为null,即检查员看到connection = null
。
如果我使用shutdown()
方法停止执行程序,一切都会完美无缺。
我一直在搜索和阅读(甚至java的源代码),但无法理解可能导致此问题的原因。
我试图抓住InterrupedException
,但显然没有被抛出
答案 0 :(得分:0)
因为我们对shutdownNow()
给你的不需要的副作用一无所知......
通常,shutdown()
应该足以使ExecutorService
拒绝新作业,并且工作线程完成队列中剩余的作业。不幸的是,shutdown()
(将允许所有先前提交的作业完成)和shutdownNow()
(将尝试中断当前正在执行的作业)之间似乎存在差距。应该有一个中间shutdownAlmostNow()
让ES完成当前的工作,但返回那些仍在等待shutdownNow()
的工作。
如果您使用ThreadPoolExecutor
,则可以调用shutdown()
,获取作业队列并将其耗尽,这样就不会接受新作业,旧作业将从队列中删除。然后你可以等待终止当前的工作。