아니요, 자바 스윙 구성 요소는 Java에서 스레드로부터 안전하지 않습니다.
Swing 구성 요소가 스레드로부터 안전하지 않은 이유
- Java Swing이 스레드로부터 안전하지 않은 주된 이유 중 하나는 구성 요소 확장 작업을 단순화하기 위함입니다.
- Java Swing의 또 다른 이유는 잠금 획득 및 해제 및 상태 복원과 관련된 오버헤드로 인해 스레드로부터 안전하지 않습니다. .
- 일부 Java Swing 구성요소 메소드는 repaint(), revalidate()와 같은 다중 스레드 액세스를 지원합니다. 및 invalidate() 메서드 JComponent 의 수업.
이벤트 디스패치 스레드(EDT)
Java Swing 구성요소는 Event Dispatch Thread(EDT ) 구성 요소가 화면에 페인팅할 수 있는 경우. EDT 스레드 paint() 와 같은 콜백 메서드를 호출하는 스레드입니다. 및 업데이트() 이벤트 리스너 i에 정의된 이벤트 핸들러 메소드 외에 인터페이스. 스레드로부터 안전한 메서드만 모든 스레드에서 안전하게 호출할 수 있습니다. 대부분의 Swing 개체 메서드는 스레드로부터 안전하지 않으므로 단일 스레드인 EDT에서 호출할 수 있습니다. .
예시
import javax.swing.*;
import java.awt.Dimension;
import java.awt.event.*;
public class EDTTest extends JPanel implements ActionListener {
private static EDTTest myPanel;
private static JFrame myFrame;
public EDTTest() {
super();
}
public Dimension getPreferredSize() {
return new Dimension(500,425);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
private static void createAndShowGUI() {
myFrame = new JFrame("EDT Program");
myFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
myFrame.setLocationRelativeTo(null);
myPanel = new EDTTest();
myFrame.add(myPanel);
initMenu();
myFrame.setVisible(true);
}
private static void initMenu() {
JMenuBar menuBar = new JMenuBar();
myFrame.setJMenuBar(menuBar);
JMenu file = new JMenu("File");
JMenuItem quit = new JMenuItem("Quit");
quit.addActionListener(myPanel);
file.add(quit);
menuBar.add(file);
}
public void actionPerformed(ActionEvent ae) {
String choice = ae.getActionCommand();
if (choice.equals("Quit")) {
System.exit(0);
}
}
} 위의 예에서 SwingUtilities.invokeLater() 이 메서드는 초기 스레드의 작업이 완료될 때까지 GUI 생성 작업을 지연시킨 다음 EDT 내부에서 GUI 생성이 발생하는지 확인합니다.
출력
