2016-05-31 147 views
1

我已經實現了一個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循環執行的操作後,讓他們活着,他們還積累了大量的內存,即使它們不再被使用。

我不希望他們被取消後,線程是活着的,我是不是就在這裏錯過了什麼?

任何幫助表示讚賞!

回答

2

這是它是如何工作的。 SwingWorker在引擎蓋下使用線程池 - 這意味着您不是通過創建SwingWorker來直接創建線程。整個過程就是讓這些線程「可重用」,因爲創建線程非常昂貴。所以你有一堆「工作者線程」會爲你執行一些任務。

請注意,如果您在第一個完成後執行另一個SwingWorker且工作線程(您在調試程序中看到的線程)處於空閒狀態,則該任務將由該線程執行,以確保創建新線程。

不要擔心資源。如果工作線程在一段時間內不會使用,那麼工作線程池將關閉工作線程。

+0

事實上,在我的計劃,應該是空閒的(因爲他們達到了「返回NULL;」?和什麼都沒有做我想)的線程不會接管另一個即將到來的SwingWorker任務的工作。即使我使用SwingWorker並重用它的「.execute()」方法。實際上,一個新的線程被創建。這就是我真正想要避免的! 說我有一個程序,用戶按下一個按鈕,然後一個迴轉工人不斷計算出一些東西。按下另一個按鈕後,Swingworker應停止計算並死亡,或者至少保持空閒狀態,並接管下一次按下第一個按鈕時的計算任務... – freeprogramer233

+0

。 在我的程序,按下第一個按鈕,第二個和重複此過程5次,它會創建5級不同的線程佔用顯著內存,而不是隻重用一個SwingWorker的線程5次或每第二個按鈕被按下時殺死它並按下第一個按鈕創建一個新的(開始計算)。 – freeprogramer233

+0

@ freeprogramer233好吧,也許你是以錯誤的方式使用SwingWorker,或者你認爲在之前的工作完成後你會發起新的工作,但事實並非如此,或者它只是執行的判斷! 如果你真的不滿意SwingWorker的工作方式,你總是可以使用嚴格的deterministict ExecutorService--你會將'Runnbale'提交給保證執行新'SwingWorkers'的線程池。祝你好運! – Antoniossss