JavaFX-এর Concurrency Model একটি অত্যন্ত গুরুত্বপূর্ণ বিষয়, যা আপনার অ্যাপ্লিকেশনে ব্যাকগ্রাউন্ড অপারেশন পরিচালনার জন্য ব্যবহৃত হয়। JavaFX-এর ইউজার ইন্টারফেস থ্রেড (UI Thread) মূলত ব্যবহারকারীর ইন্টারঅ্যাকশন পরিচালনা করে, এবং এটি ব্লক হতে দেওয়া উচিত নয়। ব্যাকগ্রাউন্ড অপারেশন সম্পাদন করার জন্য Task এবং Service দুটি গুরুত্বপূর্ণ ক্লাস রয়েছে যা ব্যাকগ্রাউন্ডে কাজ চালাতে সাহায্য করে, এবং UI থ্রেডকে ব্লক না করে কাজ সম্পাদন করা যায়।
Task এবং Service কী?
- Task:
Taskহল একটি জেনেরিক ক্লাস যাjavafx.concurrentপ্যাকেজের অধীনে আসে। এটি ব্যাকগ্রাউন্ডে একটি কাজ সম্পাদন করার জন্য ব্যবহৃত হয় এবং ইউজার ইন্টারফেসের সাথে ইন্টারঅ্যাকশন করতেupdateমেথড ব্যবহার করে।- এটি
Runnableইন্টারফেসের মতো কাজ করে, তবে এটি প্রগ্রেস আপডেট, ফলাফল এবং ব্যর্থতার প্রতিবেদন করার জন্য অতিরিক্ত ফিচার সমর্থন করে।
- Service:
Serviceহল একটি আরো উন্নত কনসেপ্ট যা একটি পুনরাবৃত্ত কার্যক্রম (repeated task) পরিচালনার জন্য ব্যবহৃত হয়, যেখানেTaskএকটি একক কার্যক্রমের জন্য ব্যবহৃত হয়।Serviceএকটি নতুনTaskতৈরি করে, এবং এটি ব্যাকগ্রাউন্ডে কাজটি চালাতে সক্ষম।
ব্যাকগ্রাউন্ড অপারেশন পরিচালনা করার জন্য Task এবং Service ব্যবহারের উদাহরণ
১. Task ব্যবহার করে ব্যাকগ্রাউন্ড অপারেশন
নিচে একটি উদাহরণ দেওয়া হয়েছে যেখানে একটি Task ব্যবহার করে ব্যাকগ্রাউন্ডে কাজ করা হচ্ছে এবং UI থ্রেডে তার প্রগ্রেস এবং রেজাল্ট আপডেট করা হচ্ছে।
import javafx.application.Application;
import javafx.concurrent.Task;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.ProgressBar;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class TaskExample extends Application {
@Override
public void start(Stage primaryStage) {
// UI উপাদান তৈরি
Button startButton = new Button("Start Task");
ProgressBar progressBar = new ProgressBar(0);
// Task তৈরি
Task<Void> backgroundTask = new Task<Void>() {
@Override
protected Void call() throws Exception {
// কাজের প্রগ্রেস আপডেট করা
for (int i = 0; i <= 100; i++) {
if (isCancelled()) {
break;
}
updateProgress(i, 100); // প্রগ্রেস আপডেট করা
Thread.sleep(100); // কিছু সময়ের জন্য ঘুমানো
}
return null;
}
};
// প্রগ্রেস আপডেট করতে Task এর সাথে UI উপাদান বাঁধা
progressBar.progressProperty().bind(backgroundTask.progressProperty());
// বাটনে ক্লিক করলে Task শুরু হবে
startButton.setOnAction(e -> {
new Thread(backgroundTask).start(); // Task ব্যাকগ্রাউন্ডে চালানো
});
// লেআউট সেট করা
VBox vbox = new VBox(10, startButton, progressBar);
Scene scene = new Scene(vbox, 300, 150);
primaryStage.setScene(scene);
primaryStage.setTitle("Task Example");
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
ব্যাখ্যা:
Taskতৈরি করা হয়েছে যা একটি ব্যাকগ্রাউন্ড অপারেশন পরিচালনা করবে। এটি প্রতি সেকেন্ডে প্রগ্রেস আপডেট করবে এবংupdateProgress()মেথড ব্যবহার করে প্রগ্রেস পরিবর্তন করবে।ProgressBarUI উপাদানকেTaskএর প্রগ্রেসের সাথে বাঁধা দেওয়া হয়েছে (progressProperty().bind()), যাতে প্রগ্রেস বার আপডেট হয়।- বাটন ক্লিক করলে একটি নতুন থ্রেড শুরু হবে যা
Taskচালাবে, এবং UI থ্রেড ব্লক হবে না।
২. Service ব্যবহার করে ব্যাকগ্রাউন্ড অপারেশন
যখন আপনার একটি পুনরাবৃত্তি কাজ করতে হয় বা একটি দীর্ঘ-running ব্যাকগ্রাউন্ড অপারেশন চালাতে হয়, তখন Service ক্লাস ব্যবহার করা হয়। এখানে একটি 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.ProgressBar;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
public class ServiceExample extends Application {
@Override
public void start(Stage primaryStage) {
// UI উপাদান তৈরি
Button startButton = new Button("Start Service");
ProgressBar progressBar = new ProgressBar(0);
// 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++) {
if (isCancelled()) {
break;
}
updateProgress(i, 100); // প্রগ্রেস আপডেট করা
Thread.sleep(100); // কিছু সময়ের জন্য ঘুমানো
}
return null;
}
};
}
};
// প্রগ্রেস আপডেট করতে Service এর সাথে UI উপাদান বাঁধা
progressBar.progressProperty().bind(service.progressProperty());
// বাটনে ক্লিক করলে Service শুরু হবে
startButton.setOnAction(e -> service.start()); // Service চালানো
// লেআউট সেট করা
VBox vbox = new VBox(10, startButton, progressBar);
Scene scene = new Scene(vbox, 300, 150);
primaryStage.setScene(scene);
primaryStage.setTitle("Service Example");
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
ব্যাখ্যা:
Serviceতৈরি করা হয়েছে, এবংcreateTask()মেথডের মাধ্যমে একটিTaskতৈরি করা হয়।Taskএর ভিতরে ব্যাকগ্রাউন্ড কাজগুলি করা হচ্ছে এবংupdateProgress()মেথড দিয়ে প্রগ্রেস আপডেট করা হচ্ছে।progressProperty()ব্যবহার করে প্রগ্রেস বার UI উপাদানকেServiceএর প্রগ্রেসের সাথে বাঁধা দেওয়া হয়েছে।service.start()দ্বারাServiceচালানো হচ্ছে।
Task এবং Service এর মধ্যে পার্থক্য:
| ক্যারেক্টারিস্টিক | Task | Service |
|---|---|---|
| ব্যবহার | একক কাজের জন্য ব্যবহৃত | পুনরাবৃত্তি কাজের জন্য ব্যবহৃত |
| ব্যাকগ্রাউন্ড থ্রেড | নিজেই থ্রেড তৈরি করে | নিজে থ্রেড তৈরি করে এবং কাজের জন্য Task তৈরি করে |
| স্টার্টিং | new Thread(task).start(); | service.start() |
| অবস্থা | একবারে একটি কাজ পরিচালনা করে | একাধিক বার চালানো যায় |
- Task এবং Service হল JavaFX-এর দুটি গুরুত্বপূর্ণ ক্লাস, যা ব্যাকগ্রাউন্ডে অপারেশন চালানোর জন্য ব্যবহৃত হয়।
Taskএকক কাজ পরিচালনা করতে ব্যবহৃত হয়, এবংServiceপুনরাবৃত্তি কাজের জন্য ব্যবহৃত হয়। - এই ক্লাসগুলি ব্যাকগ্রাউন্ড অপারেশন চালাতে সাহায্য করে এবং ইউজার ইন্টারফেস থ্রেডকে ব্লক না করে ইউজার ইন্টারঅ্যাকশনের মাধ্যমে স্মুথ ও সাড়া দানযোগ্য অ্যাপ্লিকেশন তৈরি করতে সাহায্য করে।
- Task এবং Service ক্লাস ব্যবহার করে আপনি সহজেই ব্যাকগ্রাউন্ড কাজ চালাতে পারবেন এবং প্রগ্রেস/ফলাফল ইউজার ইন্টারফেসে প্রদর্শন করতে পারবেন।
Read more