2011-04-17 56 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惯用语。