Java 解雇摇摆工人

Java 解雇摇摆工人,java,swing,swingworker,Java,Swing,Swingworker,大家好: 我的工作是为客户创建定制工具。我的雇主有一个旗舰产品,我们出售的是一个Java接口。然后,我为客户构建工具(使用Java),让他们的生活更轻松。这些工具作为从Java接口中启动的插件运行 我的问题是,在正常操作期间,我喜欢使用Swingworker来做事情。在调试期间,我开始注意到(使用NetBeans调试器),即使给定的SwingWorker已经完成,线程仍然在运行。正常情况下,这与我无关,但我随后开始注意到,即使我正在使用的工具已关闭,秋千工人仍在游泳池中闲荡。如果我关闭了主应用程

大家好:

我的工作是为客户创建定制工具。我的雇主有一个旗舰产品,我们出售的是一个Java接口。然后,我为客户构建工具(使用Java),让他们的生活更轻松。这些工具作为从Java接口中启动的插件运行

我的问题是,在正常操作期间,我喜欢使用Swingworker来做事情。在调试期间,我开始注意到(使用NetBeans调试器),即使给定的SwingWorker已经完成,线程仍然在运行。正常情况下,这与我无关,但我随后开始注意到,即使我正在使用的工具已关闭,秋千工人仍在游泳池中闲荡。如果我关闭了主应用程序,当然所有的线程都会随着JVM的终止而死亡,但是如果主应用程序仍然在运行,我的SwingWorker会挂起(即使设置了done&cancel标志)

显然,这意味着我的Java应用程序正在使用主应用程序EDT(这是有道理的),但这给我留下了一个问题。如果我有一个用户在与主应用程序的一次会话中多次运行我的工具,那么我将开始堆积僵尸SwingWorkers,他们除了占用一点内存和CPU之外什么都不做

所以,我对蜂巢思维的问题是,到底有没有办法强迫终止一个僵尸摇摆者?或者,如果没有,有没有办法重新连接到一个僵尸SwingWorker,例如,如果我知道它的名字


谢谢大家!

我认为如果您使用线程池,这是可以预期的,线程池使线程挂起(可能有一个空闲循环,导致它们显示为“正在运行”)

假设swingworkers只能执行一次,因此不可能重新连接它们。它们本身不是线程,而是在线程上执行的

您可以通过使用ExecutorService来限制池中的线程数。
有关更多详细信息,请参阅。

考虑添加一些示例代码和您尝试过的内容。示例代码不会提供任何内容,因为我对代码或语法没有任何问题,而是一些更基本的内容(SwingWorker如何使用线程池)。从内存中,
SwingWorker
使用共享的固定线程池
ExecutorService
。这意味着池可能会维护一系列
线程
s,用于执行任务(
SwingWorker
s)。这些线程应该处于空闲状态,可能在等待某种锁,这意味着它们不应该占用CPU周期。从池中重新使用这些线程,然后每次都必须重新创建新线程,这样会更快。一旦SwingWorker任务完成,线程将返回池中重新使用?这是我的理解。@Kenney
SwingWorker
已经使用了它自己的共享固定线程池
ExecutorService
,这将活跃工人的数量限制为10人。当然,您可以创建自己的,但这意味着您不能使用
SwingWorker
execute
方法,这并不是说它不能完成,它只是改变了工作flow@MadProgrammer完全正确(感谢nr 10-找不到)。我只提到使用“您自己的”ExecutorService是为了控制线程池(线程数,
关闭
)。@Kenney使用您自己的ExecutorService没有错,只需要注意工作流程的变化;)