【问题标题】:Do I need to collect swingWorker threads when they are done?完成后我需要收集 swingWorker 线程吗?
【发布时间】:2017-08-04 16:00:36
【问题描述】:

我正在使用 GUI 来调用摇摆工作线程。

在他们完成并执行方法done() 后,我正在打印Thread.activeCount()。我得到一个数字,表明线程仍然处于活动状态。

完成后我需要以某种方式收集它们吗?

【问题讨论】:

  • 收集它们是什么意思?垃圾收集?

标签: java multithreading swing swingworker


【解决方案1】:

您不能手动销毁由SwingWorker 实例创建的线程。这些线程在未公开的ThreadPoolExecutor 中运行。

public final void execute() {
    getWorkersExecutorService().execute(this);
}

private static synchronized ExecutorService getWorkersExecutorService()

您必须等待超时。生成的每个线程都有 10 分钟的超时时间。

executorService = new ThreadPoolExecutor(MAX_WORKER_THREADS, MAX_WORKER_THREADS, 10L, TimeUnit.MINUTES, new LinkedBlockingQueue<Runnable>(), threadFactory);

这些线程是守护进程,因此如果它们是程序中的最后一个线程,程序仍会关闭。

【讨论】:

  • 所以你说的是我不能手动终止它们或以某种方式收集它们。我只需要等到他们完成或被超时摧毁?如果他们没有在 10 分钟内完成会发生什么?他们会在到达 done() 函数之前被销毁吗?另一个问题,有没有办法判断一个线程是否仍然处于活动状态并且没有执行 done() 方法?
  • @David8988 是的,它们不应该被手动终止,它们会自行消亡。 10 分钟是超时时间:如果线程在该时间范围内没有被重新使用,它就会被终止。工作线程在使用时不会终止。您过于关注线程方面,而不是您真正想要的行为。您不需要深入研究哪些线程处于活动状态。您想要的是查看任务是否仍在运行/处理。您应该扩展 SwingWorker 以添加您需要的功能。
  • 没错。我需要知道任务是否仍在运行/处理。有没有办法知道使用 SwingWorker 线程实例?
  • @David8988 没有任何内置功能。通过过滤所有线程在技术上是可行的,但需要一些非常讨厌的管理。如果默认行为不能满足您的需求,您真的应该扩展它。可以创建一个 boolean running 工人设置为真/假,然后公开一个 boolean isRunning() 方法,以便其他人可以确定它是否已完成。或者您可以使用callback,当任务完成时done() 会调用它。举个具体的例子,我可以用例子给出具体的答案。
  • @David8988 "我需要知道任务是否仍在运行/处理。有没有办法知道使用 SwingWorker 线程实例?" 使用 isDone()
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多