【问题标题】:Interrupting idle thread pool workers中断空闲线程池工作者
【发布时间】:2015-03-10 14:58:47
【问题描述】:

我有一个应用程序启动 JUnit 测试运行,其中一些测试创建了一些固定大小的线程池,之后不会关闭它们。这留下了我需要摆脱的空闲线程池工作人员。我无法控制测试代码,只有启动测试运行的代码。有什么方法可以强制关闭工作线程(安全或不安全)?

我当前的无效解决方案尝试如下所示:

Set<Thread> threads = Thread.getAllStackTraces().keySet();
for (Thread thread: threads) {
    if (thread.getName().matches("pool-\\d+-thread-\\d+")) {
        thread.interrupt();
    }
}

我想要一个我仍然可以在同一个 JVM 中运行测试的解决方案。在这一点上,生成一个单独的进程是最后的手段。

编辑:我无法获得对产生工作线程的 ExecutorService 的引用(它们是在我无法控制的测试代码中创建的)。

【问题讨论】:

  • 线程需要有某种策略才能让它们关闭。中断!= 必须关闭。最好的办法是在文档中搜索创建线程的任何内容,并查看其关闭策略是什么,例如调用销毁或关闭方法。

标签: java multithreading interrupt


【解决方案1】:

如果您使用ExecutorService 来启动线程,那么您可以使用shutdownNow 后跟awaitTermination。链接的 javadocs 包含有序关闭的示例代码。

【讨论】:

  • 这对我没有帮助,因为我没有引用 ExecutorService。
  • ExecutorService 参考 = Executors.newSingleThreadExecutor();
  • @Warkst 是的,这几乎就是测试用例的作用,但我无法访问测试之外的参考,也无法编辑测试。
  • 谁编写了测试?好的测试代码会自行清理,因此编写它的人应该实现代码来终止他们创建的任何线程。
猜你喜欢
  • 1970-01-01
  • 2013-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-19
  • 2019-12-03
  • 2015-02-13
  • 2012-07-16
相关资源
最近更新 更多