아니요, 자바 스윙 구성 요소는 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 생성이 발생하는지 확인합니다.
출력