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