জাভাতে, স্বিং কম্পোনেন্টগুলি স্ক্রিনে প্রদর্শিত হলে, সেগুলি শুধুমাত্র একটি থ্রেড দ্বারা পরিচালিত হতে পারে যাকে ইভেন্ট হ্যান্ডলিং থ্রেড বলা হয়। আমরা আমাদের কোড একটি আলাদা ব্লকে লিখতে পারি এবং সেই ব্লকের রেফারেন্স ইভেন্ট হ্যান্ডলিং থ্রেড-এ দিতে পারি। SwingUtilities ক্লাসে দুটি গুরুত্বপূর্ণ স্ট্যাটিক মেথড রয়েছে, invokeAndWait() এবং invokeLater(), যেগুলি কোড ব্লকের রেফারেন্স ইভেন্ট কিউ-তে রাখতে ব্যবহৃত হয়।
সিনট্যাক্স
public static void invokeAndWait(Runnable doRun) throws InterruptedException, InvocationTargetException public static void invokeLater(Runnable doRun)
প্যারামিটার doRun হল Runnable ইন্টারফেসের একটি উদাহরণের রেফারেন্স। এই ক্ষেত্রে, Runnable ইন্টারফেসটি একটি থ্রেডের কনস্ট্রাক্টরে পাস করা হবে না। Runnable ইন্টারফেসটি শুধুমাত্র ইভেন্ট থ্রেডের এন্ট্রি পয়েন্ট চিহ্নিত করার একটি উপায় হিসেবে ব্যবহৃত হয়। ঠিক যেমন একটি নতুন Спаন থ্রেড run() আহ্বান করে, ইভেন্ট থ্রেডও কিউতে সকল পেন্ডিং ইভেন্ট প্রসেস হয়ে গেলে run() মেথড আহ্বান করে। যদি invokeAndWait() বা invokeLater() কল করার থ্রেড টার্গেট দ্বারা রেফারেন্স করা কোড ব্লক সম্পূর্ণ হওয়ার আগে ইন্টারাপ্ট হয়ে যায়, তবে একটি InterruptedException থ্রো হবে। যদি run() মেথডের ভিতরে একটি অনক্যাচ্ড এক্সেপশন থ্রো হয়, তবে একটি InvocationTargetException থ্রো হবে।
উদাহরণ
import javax.swing.*;
import java.lang.reflect.InvocationTargetException;
public class SwingUtilitiesTest {
public static void main(String[] args) {
final JButton button = new JButton("Not Changed");
JPanel panel = new JPanel();
panel.add(button);
JFrame f = new JFrame("InvokeAndWaitMain");
f.setContentPane(panel);
f.setSize(300, 100);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
System.out.println(Thread.currentThread().getName()+" is going into sleep for 3 seconds");
try {
Thread.sleep(3000);
} catch(Exception e){ }
// লেবেল পরিবর্তনের জন্য কোড প্রস্তুতি
Runnable r = new Runnable() {
@Override
public void run() {
System.out.println(Thread.currentThread().getName()+"is going into sleep for 10 seconds");
try {
Thread.sleep(10000);
} catch(Exception e){ }
button.setText("Button Text Changed by "+ Thread.currentThread().getName());
System.out.println("Button changes ended");
}
};
System.out.println("Component changes put on the event thread by main thread");
try {
SwingUtilities.invokeAndWait(r);
} catch (InvocationTargetException | InterruptedException e) {
e.printStackTrace();
}
System.out.println("Main thread reached end");
}
}
আউটপুট

