Computer >> Máy Tính >  >> Lập trình >> Java

Luồng Swing có an toàn trong Java không?

Không, Java Swing các thành phần không an toàn theo luồng trong Java.

Tại sao các thành phần Swing không an toàn cho luồng

  • Một trong những lý do chính khiến Java Swing không an toàn theo luồng là đơn giản hóa nhiệm vụ mở rộng các thành phần của nó.
  • Một lý do khác khiến Java Swing không an toàn theo chuỗi là do chi phí liên quan đến việc lấy và giải phóng khóa và khôi phục trạng thái .
  • Một số phương thức thành phần Java Swing sẽ hỗ trợ truy cập đa luồng như repaint (), revalidate () và các phương thức voidate () của JComponent lớp học.

Chuỗi sự kiện cử đi (EDT)

Chỉ có thể truy cập các thành phần Java Swing từ Chuỗi sự kiện gửi đi (EDT ) khi một thành phần có sẵn để vẽ trên màn hình. EDT chuỗi là chuỗi gọi các phương thức gọi lại như paint () update () ngoài các phương thức xử lý sự kiện được xác định trong Trình xử lý sự kiện i các giao diện. Chỉ các phương pháp an toàn luồng có thể được gọi một cách an toàn từ bất kỳ luồng nào. Vì hầu hết các phương thức đối tượng Swing không an toàn cho chuỗi, chúng có thể được gọi từ một chuỗi duy nhất, EDT .

Ví dụ

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);
      }
   }
}

Trong ví dụ trên, SwingUtilities.invokeLater () phương thức sẽ trì hoãn tác vụ tạo GUI cho đến khi hoàn thành các tác vụ của luồng ban đầu, sau đó đảm bảo rằng việc tạo GUI diễn ra bên trong EDT.

Đầu ra

Luồng Swing có an toàn trong Java không?