2013-08-31 106 views
-1

我有一個GUI,其中當點擊一個按鈕時,必須啓動一個while循環。但在啓動while循環時,GUI將暫停,直到while循環終止。有什麼辦法可以繞過這個嗎?Java while while循環沒有暫停當前線程

+2

我想你應該提供一些代碼。 –

+2

在新線程中啓動你的while循環。 – pepuch

+2

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/ – assylias

回答

1

我想一般防止這種情況發生,就應建立另一個Thread冗長的計算,然後更新通過EDT的GUI(使用SwingUtilities.invokeLater(Runnable);

所以你的情況,當按下該按鈕,它會是這樣的:

final Thread thread = new Thread(
     new Runnable(){ 
      public void run(){ 
       while(condition){ 
        ..... 
       } 
       //update gui 
      } 
     } 
); 
thread.start(); 

或者,如果你使用的是Java 8中,您可以使用lambda表達式:

final Thread thread = new Thread(
     () -> { 
      while(condition){ 
       ..... 
      } 
      //update gui 
     } 
); 
thread.start(); 

你可以刪除while通過利用作爲某種監聽器的interface進行循環。

+0

謝謝,那很好。 – user1959216

0

將你的while循環包裝在一個Runnable中,並開始使用線程運行。注意:new Thread(r).run();將在同一個線程上運行它。下面的代碼不應該。

Runnable r = new Runnable() { 
    public void run() { 
     while(whatever){ 
     //do stuff 
     } 
    } 
} 

new Thread(r).start(); 
0

正如@kayton所說,將您的代碼包裝在Runnable中。 (或者可能是Callable)

但是,如果您不斷創建並在您的代碼中創建自己的線程,它很快就會變得難以管理。改爲查看ExecutorService或SwingWorker。

+0

爲什麼downvote?至少有禮貌和勇氣來解釋。 – user949300

0

從設計的角度來看,這更多的是建議,而不是解決技術問題,我認爲暫停GUI並不是一個好主意。你可以展示一個旋轉的圓圈,告訴用戶窗簾後面有一些動作。暫停屏幕可能會讓用戶惱火。