从Swing应用程序的EDT事件处理程序代码内部启动线程

问题描述 投票:0回答:1

我对Swing Event Dispatcher Thread(EDT)]的理解是,它是执行事件处理代码的专用线程。因此,如果我的理解是正确的,那么在下面的示例中:

private class ButtonClickListener implements ActionListener{
   public void actionPerformed(ActionEvent e) {
      // START EDT
      String command = e.getActionCommand();  

      if( command.equals( "OK" ))  {
         statusLabel.setText("Ok Button clicked.");
      } else if( command.equals( "Submit" ) )  {
         statusLabel.setText("Submit Button clicked.");
      } else {
         statusLabel.setText("Cancel Button clicked.");
      }     
      // END EDT
   }        
}

START EDTEND EDT之间的所有代码都在EDT上执行,而它之外的任何代码都在主应用程序线程上执行。同样,另一个例子:

// OUTSIDE EDT
JFrame mainFrame = new JFrame("Java SWING Examples");
mainFrame.setSize(400,400);
mainFrame.setLayout(new GridLayout(3, 1));
mainFrame.addWindowListener(new WindowAdapter() {
   public void windowClosing(WindowEvent windowEvent){
      // START EDT
      System.exit(0);
      // END EDT
   }        
   // BACK TO BEING OUTSIDE THE EDT
});  

同样,在EDT中仅执行System.exit(0)

因此对于初学者来说,如果我对EDT和主应用程序线程代码执行之间的“分工”了解不正确,请先纠正我!

[现在,我遇到了一篇文章,强调使用从所有这些EDT代码内部创建新的Thread,这会使上面的第一个示例看起来像这样:

public class LabelUpdater implements Runnable {
  private JLabel statusLabel;
  private ActionEvent actionEvent;

  // ctor omitted here for brevity

  @Override
  public void run() {
    String command = actionEvent.getActionCommand();  

    if (command.equals( "OK" ))  {
       statusLabel.setText("Ok Button clicked.");
    } else if( command.equals( "Submit" ) )  {
       statusLabel.setText("Submit Button clicked.");
    } else {
       statusLabel.setText("Cancel Button clicked.");
    }   
  }
}

private class ButtonClickListener implements ActionListener{
   public void actionPerformed(ActionEvent e) {
      // START EDT
      Thread thread = new Thread(new LabelUpdater(statusLabel, e));
      thread.start();
      // END EDT
   }        
}

我的问题:这种方法有什么优势(或没有优势)?我应该以这种方式always

来编码我的EDT代码,还是需要遵循一个专栏作为when应用的准则?预先感谢!

我对Swing Event Dispatcher Thread(EDT)的理解是,它是执行事件处理代码的专用线程。因此,如果我的理解是正确的,则在下面的示例中:...

java multithreading swing java-8 event-dispatch-thread
1个回答
2
投票

这个问题有点宽泛且不确定,但是我将尝试解决您所询问的一些问题。进一步进行自己的研究的切入点可能是Lesson: Concurrency in Swing,尽管实际上可能很难从中得出针对特定情况的明确陈述。]

首先,Swing中有一个总体规则-称为单线程规则

© www.soinside.com 2019 - 2024. All rights reserved.