2011-04-17 58 views
2

在設置線程來啓動我的MIDI音序器之後,我決定簡單地刪除它,雖然它會減慢我的UI,但我可以正確使用它。帶有Swing UI的Java線程

但是我注意到,即使在播放音序器時,UI也非常活躍,即使它在播放大約500個音符時UI的工作效果也很好。

現在我知道在C#中,如果您正在做一些密集的事情,建議將它加載到一個新的線程上,因爲它將釋放UI。在Java中它是一樣的原理,它真的讓我困惑。如果有的話可以解釋一下用戶界面如何被阻止?

感謝

編輯:

下面的代碼實際上扮演的序列

public static boolean Play() { 
    if(!_sequencer.isRunning()) { 
     try { 
      _sequencer.setSequence(_sequence); 
      _sequencer.start(); 

      return true; 
     } catch (Exception e) { 
      Logger.Add(e.getMessage()); 
     } 
    } 
    return false; 
    //Already running 
} 

回答

7

是的,它是相同的理論。只有事件線程可以修改UI,因此如果您在該線程上執行任何操作,則會阻止其他事件在UI上工作。

它可能會更容易去思考事件線程的隊列:

  1. 節目形態
  2. 點擊按鈕
  3. 做你的工作(Action)按鈕的
  4. 復位重點
  5. 更新進度條
  6. Et cetera

如果#3需要很長時間,那麼這可能意味着您的表單會顯示鎖定狀態。顯然它完全取決於你對長的定義。一般來說,最好是從事件線程而不是其上。

+2

它甚至被稱爲['EventQueue'(http://download.oracle.com/javase/6/docs/api/java/awt/EventQueue.html)。 :-) – trashgod 2011-04-17 20:13:40

+0

好,我很習慣評論EDT(Event Dispatch Thread),我忘記了那個名字:)。 – pickypg 2011-04-17 20:15:51

+0

偉大的答案pi​​ckypg! – 2011-04-17 20:18:48

2

這絕對是相同的本金。一般來說,你只想用UI線程做最少的工作。如果最終花費大量時間,可能會導致UI無響應,並且您可能會收到「無響應」錯誤。您希望保持UI線程儘可能自由,以便它可以響應用戶交互。

2

如果您的應用程序具有圖形用戶界面,建議您在新線程上執行昂貴的計算以防止凍結圖形。您可以創建一個SwingWorker或使用Callable/Future慣用語。