Computer >> 컴퓨터 >  >> 프로그램 작성 >> Java

Swing은 Java에서 스레드로부터 안전합니까?

<시간/>

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

출력

Swing은 Java에서 스레드로부터 안전합니까?