2012-07-24 94 views
2

我有創建者類,它具有創建線程的匿名內部可運行類。我也有創建GUI的GUI類,並且在按鈕按下時執行「Creator」類。但是,然後我的GUI凍結,直到完成由「創建者」創建的所有線程。我發現SwingWorker可以在這種情況下幫助我,但我無法理解如何在這種特殊情況下創建一個。還有什麼比SwingWorker更簡單的方法嗎?SwingWorker運行創建線程的類。 Java

這裏是我的創造者類的代碼:

public class Creator { 

    final ExecutorService es; 
    Collection<Future<?>> futures = new LinkedList<>(); 


    public Creator() { 
     es = Executors.newFixedThreadPool(10); 
    } 

    public void runCreator() { 

     for (int i = 0; i < 100; i++) { 
      futures.add(es.submit(new Check(i))); 
     } 

     es.shutdown(); 

     for (Future<?> future : futures) { 
      try { 
       future.get(); 
      } catch (Exception ex) { 

      } 
     } 

    } 

    private class Check implements Runnable { 

    private int i; 

     private Check(int i) { 
      this.i = i; 

     } 

     @Override 
     public void run() { 

    System.out.println("Number: "+i); 

    try { 
       Thread.sleep(1000); 
      } catch (InterruptedException ex) { 

      } 
     } 
    } 
} 
+0

你可以在你創建線程的地方顯示一些代碼嗎? – 2012-07-24 20:21:37

+0

好的,我會編輯我的代碼,我會盡量簡化它,現在我們可以做到 – 2012-07-24 20:23:37

+0

,看看 – 2012-07-24 20:33:50

回答

0

爲什麼你的代碼是掛直到它完成的原因,是因爲調用你的Future's get method的。這將等到它完成。另外,在添加完所有線程後,您可能不希望關閉池。只需添加關閉事件並將其關閉即可。

由於您所做的只是打印一個號碼並進行睡眠,因此您無需等待「未來」完成。只要刪除電話獲得,延遲應停止。

+0

你的內部可運行類是什麼? – 2012-07-24 20:26:20

+0

雖然不會影響線程池中的可運行。一旦提交到池中,您會期望它返回控制權。除非海報可以在返回的Future上調用get()嗎? – 2012-07-24 20:29:54

+0

但是我還需要知道線程何時完成,我如何管理它? – 2012-07-24 20:45:21

0

是的,搖擺的工人是要走的路 - 有在網絡上足夠的例子,但總結 - 把你的線程產卵和doInBackground()等待代碼,如果你想報告階段性進展,使用publish()/process()最後,將您的數據提供給done()中的Swing EDT線程。

PS。與SwingWorker的用法無關,您可能需要考慮使用完成服務,而不是等待所有未來的訂單。