JavaFX এ, UI থ্রেডে কাজ করার সময় একটি সমস্যা দেখা দিতে পারে যখন দীর্ঘ সময়ের জন্য ব্লকিং অপারেশন (যেমন ডেটাবেস অ্যাক্সেস, ফাইল আই /ও অপারেশন, বা নেটওয়ার্ক রিকুয়েস্ট) চলতে থাকে। এর ফলে ইউজার ইন্টারফেস (UI) "হ্যাং" হয়ে যেতে পারে, যা একটি খারাপ ব্যবহারকারীর অভিজ্ঞতা তৈরি করে। JavaFX এ এই সমস্যা এড়ানোর জন্য কনকারেন্সি মডেল তৈরি করা হয়েছে যা বিভিন্ন থ্রেডে কাজ করার জন্য একটি সুসংগঠিত উপায় সরবরাহ করে।
JavaFX এর কনকারেন্সি মডেলটি এক্সিকিউশন থ্রেড এবং টাস্কের মধ্যে যোগাযোগের জন্য তিনটি প্রধান উপাদান ব্যবহার করে:
- UI Thread (Application Thread): এটি JavaFX অ্যাপ্লিকেশনের প্রধান থ্রেড যেখানে UI উপাদান তৈরি এবং প্রদর্শিত হয়। আপনি UI উপাদান কেবলমাত্র এই থ্রেডের মাধ্যমে পরিচালনা করতে পারেন।
- Worker Threads (Background Threads): এই থ্রেডগুলি দীর্ঘ-running কাজ (যেমন নেটওয়ার্ক রিকুয়েস্ট বা ফাইল অপারেশন) করতে ব্যবহৃত হয়। এসব থ্রেড UI থ্রেডে কোন পরিবর্তন করতে পারে না, তবে তারা UI থ্রেডের সাথে যোগাযোগ করতে পারে।
- JavaFX
TaskএবংService: JavaFX এর মধ্যেTaskএবংServiceক্লাসগুলি বিশেষভাবে কনকারেন্সি ম্যানেজমেন্টের জন্য ব্যবহৃত হয়।
JavaFX কনকারেন্সি মডেলের মূল উপাদানসমূহ
1. Worker Threads (ব্যাকগ্রাউন্ড থ্রেড)
JavaFX UI থ্রেডের পাশাপাশি ব্যাকগ্রাউন্ড থ্রেডে কাজ করতে হলে, আপনাকে সেই থ্রেডে কাজের জন্য Task বা Service ব্যবহার করতে হবে। UI থ্রেডে সরাসরি ব্যাকগ্রাউন্ড কাজ করা সম্ভব নয়, তাই এসব ক্লাস UI থ্রেডের থেকে ব্যাকগ্রাউন্ড থ্রেডে কাজ চালানোর সুযোগ দেয় এবং UI-তে পরিবর্তন আনতে সাহায্য করে।
2. Task Class
Task ক্লাস হল একটি Worker সাবক্লাস যা ব্যাকগ্রাউন্ড কাজের জন্য ব্যবহৃত হয় এবং UI থ্রেডে ফলাফল বা স্ট্যাটাস পাঠানোর জন্য সেট করা যেতে পারে।
Task ক্লাসের সাহায্যে আপনি ব্যাকগ্রাউন্ডে কাজ চালাতে পারেন এবং তার ফলাফল UI থ্রেডে পাঠাতে পারেন।
3. Service Class
Service ক্লাস হল Task এর একটি উন্নত সংস্করণ, যা পুনরাবৃত্ত কাজ বা লং রানিং টাস্কের জন্য উপযুক্ত। Service ক্লাসের মধ্যে একটি অতিরিক্ত সুবিধা হল এটি একাধিক থ্রেডে পুনরাবৃত্তি করা যেতে পারে।
JavaFX Task Example
নিচে একটি উদাহরণ দেওয়া হয়েছে, যেখানে Task ব্যবহার করে ব্যাকগ্রাউন্ডে কাজ চলছে এবং UI থ্রেডে ফলাফল আপডেট করা হচ্ছে।
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class ConcurrencyExample extends Application {
@Override
public void start(Stage primaryStage) {
Label label = new Label("Processing...");
// Task তৈরি
Task<Void> task = new Task<Void>() {
@Override
protected Void call() throws Exception {
for (int i = 0; i < 100; i++) {
// কাজ চালিয়ে যাওয়ার সময় স্ট্যাটাস আপডেট
updateMessage("Processing: " + i + "%");
Thread.sleep(50); // 50 মিলি সেকেন্ড বিরতি
}
return null;
}
};
// Task এর মেসেজ আপডেট UI তে দেখানো
label.textProperty().bind(task.messageProperty());
// Task রান করা
Thread thread = new Thread(task);
thread.setDaemon(true);
thread.start();
StackPane root = new StackPane();
root.getChildren().add(label);
Scene scene = new Scene(root, 300, 200);
primaryStage.setScene(scene);
primaryStage.setTitle("JavaFX Concurrency Example");
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
ব্যাখ্যা:
Task<Void>:Taskক্লাস একটি ব্যাকগ্রাউন্ড টাস্ক তৈরি করে যা UI থ্রেডে ফলাফল পাঠাতে পারে।updateMessage(): এটি ব্যাকগ্রাউন্ড থ্রেড থেকে UI থ্রেডে একটি মেসেজ পাঠানোর জন্য ব্যবহৃত হয়। এটি UI তে কাজের প্রগতি দেখায়।textProperty().bind():Taskএর মেসেজ প্রপার্টি UI এর লেবেলটির টেক্সট প্রপার্টির সাথে বেঁধে দেওয়া হয়েছে, যাতে ব্যাকগ্রাউন্ড কাজের স্ট্যাটাস UI তে আপডেট হয়।
JavaFX Service Example
Service ক্লাস ব্যবহার করে, আপনি একটি লং রানিং টাস্কের জন্য একটি পুনরাবৃত্ত কাজ তৈরি করতে পারেন।
import javafx.application.Application;
import javafx.concurrent.Service;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
public class ServiceExample extends Application {
@Override
public void start(Stage primaryStage) {
Label label = new Label("Starting...");
// Service তৈরি
Service<Void> service = new Service<Void>() {
@Override
protected Task<Void> createTask() {
return new Task<Void>() {
@Override
protected Void call() throws Exception {
for (int i = 0; i < 100; i++) {
// প্রক্রিয়ার স্ট্যাটাস আপডেট
updateMessage("Processing: " + i + "%");
Thread.sleep(50); // 50 মিলি সেকেন্ড বিরতি
}
return null;
}
};
}
};
// Service এর মেসেজ আপডেট UI তে দেখানো
label.textProperty().bind(service.messageProperty());
// বাটন ক্লিক করলে Service চালানো হবে
Button button = new Button("Start Process");
button.setOnAction(e -> service.start());
StackPane root = new StackPane();
root.getChildren().addAll(label, button);
Scene scene = new Scene(root, 300, 200);
primaryStage.setScene(scene);
primaryStage.setTitle("JavaFX Service Example");
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
ব্যাখ্যা:
Serviceক্লাস: এটি একটি কাজ বা টাস্ক পরিচালনা করে যা পুনরাবৃত্তি করা যেতে পারে।createTask():Serviceএর মাধ্যমে আপনি একটিTaskতৈরি করেন যা ব্যাকগ্রাউন্ডে রান করবে।messageProperty(): একইভাবে,Serviceএর মেসেজ প্রপার্টি UI তে আপডেট হয়।
JavaFX Concurrency Model এর সুবিধা
- UI থ্রেড ব্লক করা থেকে রক্ষা: ব্যাকগ্রাউন্ড থ্রেডে কাজ করার ফলে UI থ্রেড ব্লক হয় না এবং ব্যবহারকারীর অভিজ্ঞতা উন্নত হয়।
- UI-তে প্রগ্রেস বার আপডেট: আপনি সহজেই ব্যাকগ্রাউন্ড কাজের অগ্রগতি UI তে প্রদর্শন করতে পারেন।
TaskএবংServiceক্লাস: এই ক্লাসগুলি পুনরাবৃত্ত কাজ এবং একাধিক টাস্ক ম্যানেজ করতে সাহায্য করে।
JavaFX এর Concurrency Model অত্যন্ত শক্তিশালী এবং ইন্টারেক্টিভ অ্যাপ্লিকেশন তৈরি করার জন্য অত্যন্ত গুরুত্বপূর্ণ। এটি UI থ্রেডে কাজ না করে ব্যাকগ্রাউন্ড থ্রেডে লম্বা-running অপারেশন চালানোর সুবিধা দেয় এবং UI কে সহজেই আপডেট করা সম্ভব করে। Task এবং Service ক্লাসগুলি আপনার অ্যাপ্লিকেশনের কর্মক্ষমতা বৃদ্ধি করতে সহায়ক।
Read more