नहीं, जावा स्विंग जावा में घटक थ्रेड-सुरक्षित नहीं हैं।
क्यों स्विंग घटक थ्रेड-सुरक्षित नहीं हैं
- जावा स्विंग का एक मुख्य कारण थ्रेड-सुरक्षित नहीं है, इसके घटकों को विस्तारित करने के कार्य को सरल बनाना है।
- जावा स्विंग का एक अन्य कारण थ्रेड-सुरक्षित नहीं है क्योंकि इसमें ताले प्राप्त करना और जारी करना और राज्य को पुनर्स्थापित करना शामिल है ।
- जावा स्विंग घटक विधियों में से कुछ बहु-थ्रेडेड एक्सेस का समर्थन करेंगे जैसे repaint(), revalidate() , और अमान्य() विधियां JComponent . का कक्षा।
इवेंट डिस्पैच थ्रेड (EDT)
Java Swing घटकों को केवल ईवेंट डिस्पैच थ्रेड (EDT . से ही एक्सेस किया जा सकता है ) एक बार एक घटक ऑनस्क्रीन पेंटिंग के लिए उपलब्ध है। ईडीटी धागा वह थ्रेड है जो पेंट () . जैसी कॉलबैक विधियों का आह्वान करता है और अपडेट करें () ईवेंट श्रोता i . में परिभाषित ईवेंट हैंडलर विधियों के अतिरिक्त इंटरफेस किसी भी थ्रेड से केवल थ्रेड-सुरक्षित विधियों को सुरक्षित रूप से लागू किया जा सकता है। चूंकि अधिकांश स्विंग ऑब्जेक्ट विधियां थ्रेड-सुरक्षित नहीं हैं, इसलिए उन्हें एक ही थ्रेड, 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 के अंदर होता है।
आउटपुट