না, জাভা সুইং উপাদানগুলি জাভাতে থ্রেড-নিরাপদ নয়।
কেন সুইং উপাদানগুলি থ্রেড-নিরাপদ নয়
- জাভা সুইং থ্রেড-নিরাপদ না হওয়ার একটি প্রধান কারণ হল এর উপাদানগুলিকে প্রসারিত করার কাজকে সহজ করা৷
- জাভা সুইংয়ের আরেকটি কারণ হল ওভারহেড লকগুলি প্রাপ্ত করা এবং ছেড়ে দেওয়া এবং অবস্থা পুনরুদ্ধার করার সাথে জড়িত থাকার কারণে থ্রেড-নিরাপদ নয়। .
- জাভা সুইং কম্পোনেন্টের কিছু পদ্ধতি মাল্টি-থ্রেডেড অ্যাক্সেস সমর্থন করবে যেমন রিপেইন্ট(), রিভালিডেট() , এবং অবৈধ() পদ্ধতি এর JComponent ক্লাস।
ইভেন্ট ডিসপ্যাচ থ্রেড (EDT)
জাভা সুইং উপাদানগুলি শুধুমাত্র ইভেন্ট ডিসপ্যাচ থ্রেড (EDT থেকে অ্যাক্সেস করা যেতে পারে) ) অনস্ক্রিন পেইন্টিং জন্য একটি উপাদান উপলব্ধ একবার. EDT থ্রেড থ্রেড হল কলব্যাক পদ্ধতি যেমন paint() এবং আপডেট() ইভেন্ট লিসেনার 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-এর মধ্যে ঘটে।
আউটপুট