我对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 EDT
和END 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
,这会使上面的第一个示例看起来像这样:
来编码我的EDT代码,还是需要遵循一个专栏作为when应用的准则?预先感谢!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
我对Swing Event Dispatcher Thread(EDT)的理解是,它是执行事件处理代码的专用线程。因此,如果我的理解是正确的,则在下面的示例中:...
这个问题有点宽泛且不确定,但是我将尝试解决您所询问的一些问题。进一步进行自己的研究的切入点可能是Lesson: Concurrency in Swing,尽管实际上可能很难从中得出针对特定情况的明确陈述。]
首先,Swing中有一个总体规则-称为单线程规则