我已經實現了一個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