Java Swing 是執行緒安全的嗎?
不,**Java Swing** 元件在 Java 中不是執行緒安全的。
為什麼 Swing 元件不是執行緒安全的
- Java Swing 不是執行緒安全的主要原因之一是為了簡化擴充套件其元件的任務。
- Java Swing 不是執行緒安全的另一個原因是獲取和釋放鎖以及恢復狀態所涉及的開銷。
- 一些 Java Swing 元件方法支援多執行緒訪問,例如 **JComponent** 類的 **repaint()、revalidate()** 和 **invalidate() 方法**。
事件分發執行緒 (EDT)
一旦元件可用於螢幕上繪製,Java Swing 元件只能從 **事件分發執行緒 (EDT)** 訪問。**EDT 執行緒**是呼叫回撥方法(例如 **paint()** 和 **update()**)以及在 **事件監聽器** 介面中定義的事件處理程式方法的執行緒。只有執行緒安全的方法才能從任何執行緒安全地呼叫。由於大多數 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 建立任務,直到初始執行緒的任務完成,然後確保 GUI 建立發生在 EDT 中。
輸出
廣告