我已经实现了一个SwingWorker在while循环中执行一些操作。SwingWorker(线程)不会死亡(到达“return null;”后仍然存在)?
worker = new SwingWorker<Void, String>()
{
public Void doInBackground()
{
while(!this.isCancelled())
{
//perform operations
}
return null;
}
};
worker.execute();
我想取消SwingWorker,因此保留对“worker”的引用并使用它的cancel方法。
取消基本上可以正常工作(=“return null;”已到达),但相应的线程在取消之后似乎仍然存在(如在eclipse中的调试窗口中所示),并占用资源。
所以开始几个工作线程,并取消他们停在while循环执行的操作后,让他们活着,他们还积累了大量的内存,即使它们不再被使用。
我不希望他们被取消后,线程是活着的,我是不是就在这里错过了什么?
任何帮助表示赞赏!
事实上,在我的计划,应该是空闲的(因为他们达到了“返回NULL;”?和什么都没有做我想)的线程不会接管另一个即将到来的SwingWorker任务的工作。即使我使用SwingWorker并重用它的“.execute()”方法。实际上,一个新的线程被创建。这就是我真正想要避免的! 说我有一个程序,用户按下一个按钮,然后一个回转工人不断计算出一些东西。按下另一个按钮后,Swingworker应停止计算并死亡,或者至少保持空闲状态,并接管下一次按下第一个按钮时的计算任务... – freeprogramer233
。 在我的程序,按下第一个按钮,第二个和重复此过程5次,它会创建5级不同的线程占用显著内存,而不是只重用一个SwingWorker的线程5次或每第二个按钮被按下时杀死它并按下第一个按钮创建一个新的(开始计算)。 – freeprogramer233
@ freeprogramer233好吧,也许你是以错误的方式使用SwingWorker,或者你认为在之前的工作完成后你会发起新的工作,但事实并非如此,或者它只是执行的判断! 如果你真的不满意SwingWorker的工作方式,你总是可以使用严格的deterministict ExecutorService--你会将'Runnbale'提交给保证执行新'SwingWorkers'的线程池。祝你好运! – Antoniossss