【问题标题】:Java ExecutorService callback on thread terminate线程终止时的 Java ExecutorService 回调
【发布时间】:2011-08-17 06:52:54
【问题描述】:

我正在使用缓存线程池 ExecutorService 来运行一些异步后台任务。我已经提供了我的 ThreadFactory,它将线程分发给 ExecutorService(只要它需要它们)。我对缓存线程池的理解是,在线程空闲 60 秒后,它会被 ExecutorService 终止。

我想在我的线程即将终止时执行一些状态清理。实现这一目标的最佳方法是什么? ExecutorService 不会轻易地提供进入线程生命周期的钩子。

我不想关闭我的 ExecutorService - 这对于在任务到来时运行任务很有用。

ExecutorService executor = Executors.newCachedThreadPool(new MyThreadFactory());

// Do some work
executor.submit(new MyCallable());

// Need a way for the ExecutorService to notify me when it is about to
// terminate my thread - need to perform some cleanup

谢谢,

Shreyas

【问题讨论】:

  • +1 有趣的问题。我想知道终结器是否可以工作?
  • @Rom1,有人在回答中发帖建议实施finalize。我认为他们删除它太糟糕了。需要注意的是,使用finalize 意味着会在 GC 和 JVM 中产生一些性能损失。
  • 我尝试使用 finalize 方法,但没有成功。该方法没有被调用。
  • @Tim,当然,接受的答案看起来比干预终结者要好得多
  • 它或多或少类似于:stackoverflow.com/questions/826212/…

标签: java multithreading threadpool executorservice


【解决方案1】:

在您的ThreadFactory 代码中,创建Thread 的实例,以便try 执行为它创建的Runnable 的工作,然后finally 执行您的清理工作。像这样:

public Thread newThread(final Runnable r) {
    Thread t = new Thread() {
        public void run() {
            try {
                r.run();
            } finally {
                //do cleanup code
            }
        }
    };
    return t;
}

【讨论】:

  • 另一种选择是使用固定大小的线程池并且从不清理。释放的内存永远不会传递回操作系统,因此您可能会增加复杂性而没有任何好处。
  • 但如果需要清理的是数据库连接,你不能只是“永远不清理”。
猜你喜欢
  • 2011-08-22
  • 2015-01-11
  • 2014-11-18
  • 2021-08-27
  • 1970-01-01
  • 1970-01-01
  • 2015-07-18
  • 2012-08-28
  • 2019-03-15
相关资源
最近更新 更多