JTextField.getText与JButton.addActionListener是否需在EDT执行?示例程序是否有误?
这个Swing程序确实存在线程安全问题
Swing有明确的线程安全规则:所有涉及Swing组件的操作(包括组件属性访问、事件监听器添加等)必须在事件调度线程(EDT)上执行,否则可能引发UI状态异常、线程竞争甚至程序崩溃等未定义行为。
看你给出的代码:
SwingUtilities.invokeAndWait( () -> showGUI() )确保了UI组件的创建在EDT上完成,但后续的x行和y行是在main线程(非EDT)执行的:- x行:
System.out.println( text.getText() )直接在非EDT线程访问Swing组件的属性,违反线程安全规则。 - y行:
button.addActionListener( System.out::println )在非EDT线程给Swing组件添加事件监听器,同样违反规则。
- x行:
这类操作在简单场景下可能不会立刻出现问题,但属于不安全的编码方式,不可依赖。正确的做法是把这两行也放到EDT中执行,比如用SwingUtilities.invokeLater包裹:
SwingUtilities.invokeLater(() -> { System.out.println( text.getText() ); button.addActionListener( System.out::println ); });
内容的提问来源于stack exchange,提问作者Jack Straub
相关产品推荐
相关产品推荐

