Guava লাইব্রেরি জাভাতে অ্যাসিঙ্ক্রোনাস (Asynchronous) কার্যকলাপ এবং ক্যালব্যাক (Callback) হ্যান্ডলিং এর জন্য শক্তিশালী ইউটিলিটি সরবরাহ করে। Guava-এর ListenableFuture এবং ListeningExecutorService ক্লাসগুলো ব্যবহার করে আপনি সহজে অ্যাসিঙ্ক্রোনাস এক্সিকিউশন এবং ক্যালব্যাক হ্যান্ডলিং পরিচালনা করতে পারবেন। এই প্রক্রিয়াগুলি আপনার অ্যাপ্লিকেশনে নিরবচ্ছিন্নভাবে কার্যক্রম চালিয়ে যেতে সহায়তা করে, যাতে UI থ্রেড ব্লক না হয় এবং অন্যান্য কার্যক্রম চালানো যায়।
Async Execution এর ধারণা
Asynchronous Execution হল এমন একটি পদ্ধতি যেখানে কার্যকলাপ (tasks) একসাথে সিঙ্ক্রোনাসভাবে না চলে় আলাদা আলাদা থ্রেডে সম্পন্ন হয়। এর ফলে এক বা একাধিক দীর্ঘ-running কাজ সম্পাদন করার সময় অন্য কাজের ক্ষেত্রে বিলম্ব (delay) ঘটে না। Java-তে অ্যাসিঙ্ক্রোনাস কার্যকলাপ ব্যবহারের জন্য Guava লাইব্রেরির ListenableFuture এবং ListeningExecutorService ব্যবহার করা হয়।
ListenableFuture এবং ListeningExecutorService
ListenableFuture: এটি Guava-এর একটি ইন্টারফেস যা java.util.concurrent.Future এর মতো কাজ করে, কিন্তু এর সাথে ক্যালব্যাক হ্যান্ডলিং (callback handling) সহজ করা হয়। এর মাধ্যমে আপনি নির্দিষ্ট কাজ সম্পন্ন হওয়ার পরে (success or failure) একটি ক্যালব্যাক কার্যকরী করতে পারেন।
ListeningExecutorService: এটি Guava-এর একটি ইন্টারফেস যা java.util.concurrent.ExecutorService এর মতো, কিন্তু এটি ListenableFuture রিটার্ন করে এবং ক্যালব্যাকগুলোর ব্যবস্থাপনা সহজ করে।
Async Execution এর জন্য উদাহরণ
ধরা যাক, আপনি এমন একটি অ্যাসিঙ্ক্রোনাস কাজ করতে চান, যেখানে একটি দীর্ঘ-running প্রসেস (যেমন ফাইল ডাউনলোড বা ডেটাবেস থেকে ডেটা ফেচ) সম্পন্ন হলে আপনি ফলাফল নিতে পারবেন এবং পরে সেটির ওপর নির্দিষ্ট কাজ করতে পারবেন।
উদাহরণ: ListenableFuture ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজ
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.ThreadFactoryBuilder;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
public class AsyncExecutionExample {
public static void main(String[] args) throws Exception {
// ExecutorService তৈরি করা
ListeningExecutorService service = MoreExecutors.listeningDecorator(
Executors.newFixedThreadPool(2, new ThreadFactoryBuilder().setNameFormat("worker-thread-%d").build())
);
// অ্যাসিঙ্ক্রোনাস কাজের জন্য Callable ব্যবহার
Callable<String> task = () -> {
Thread.sleep(2000); // 2 সেকেন্ড অপেক্ষা করা
return "Task completed!";
};
// ListenableFuture তৈরি করা
ListenableFuture<String> future = service.submit(task);
// যখন কাজটি শেষ হবে, তখন ক্যালব্যাকে ফলাফল পাবে
future.addListener(() -> {
try {
// ক্যালব্যাক: কাজের ফলাফল প্রিন্ট করা
System.out.println(future.get());
} catch (Exception e) {
e.printStackTrace();
}
}, service);
// Main thread অন্য কাজ চালাতে পারে
System.out.println("Main thread is free to do other work.");
}
}
এখানে, ListenableFuture দ্বারা অ্যাসিঙ্ক্রোনাস কাজ সম্পন্ন হওয়ার পর ক্যালব্যাক কার্যকরী হয় এবং ফলাফল মুদ্রিত হয়। addListener() মেথডটি ক্যালব্যাক পরিচালনা করে, যাতে কাজের সম্পন্ন হওয়ার পরে আপনি নির্দিষ্ট কার্যক্রম সম্পাদন করতে পারেন।
Callback Handling
Callback Handling হল এমন একটি প্রক্রিয়া, যেখানে একটি প্রোগ্রাম বা সিস্টেম অন্য একটি কার্যক্রমের শেষে ফলাফল পাওয়ার জন্য অপেক্ষা করে এবং তারপরে সেই ফলাফল ব্যবহার করে পরবর্তী কার্যক্রমটি চালায়। Guava-তে ListenableFuture এবং addListener() এর মাধ্যমে ক্যালব্যাক হ্যান্ডলিং সহজ করা হয়েছে।
Callback Handling এর জন্য উদাহরণ
import com.google.common.util.concurrent.ListenableFuture;
import com.google.common.util.concurrent.ListeningExecutorService;
import com.google.common.util.concurrent.MoreExecutors;
import com.google.common.util.concurrent.Futures;
import java.util.concurrent.Callable;
import java.util.concurrent.Executors;
public class CallbackHandlingExample {
public static void main(String[] args) throws Exception {
// ExecutorService তৈরি করা
ListeningExecutorService service = MoreExecutors.listeningDecorator(
Executors.newFixedThreadPool(2)
);
// একটি সহজ Callable কাজ যা 3 সেকেন্ডে ফলাফল দেয়
Callable<String> task = () -> {
Thread.sleep(3000); // 3 সেকেন্ড অপেক্ষা করা
return "Task Finished!";
};
// ListenableFuture তৈরি করা
ListenableFuture<String> future = service.submit(task);
// কাজ শেষ হওয়ার পর একটি ক্যালব্যাক পরিচালনা করা
Futures.addCallback(future, new com.google.common.util.concurrent.FutureCallback<String>() {
@Override
public void onSuccess(String result) {
// সফল হলে কাজের ফলাফল প্রিন্ট করা
System.out.println("Callback received: " + result);
}
@Override
public void onFailure(Throwable t) {
// কোনো ত্রুটি হলে ত্রুটি বার্তা প্রিন্ট করা
t.printStackTrace();
}
}, service);
// Main thread অন্যান্য কাজ চালাতে পারে
System.out.println("Main thread is free while task is running.");
}
}
এখানে, Futures.addCallback() মেথড ব্যবহার করে অ্যাসিঙ্ক্রোনাস কাজের সফল বা ব্যর্থ ফলাফল পাওয়া গেলে ক্যালব্যাক হ্যান্ডলিং করা হয়েছে। ক্যালব্যাকের মাধ্যমে সফল ফলাফল বা ত্রুটি বার্তা প্রসেস করা হচ্ছে।
Advantages of Async Execution and Callback Handling
- Non-blocking operations: অ্যাসিঙ্ক্রোনাস এক্সিকিউশন থ্রেডের ব্লকিং এড়াতে সহায়তা করে, তাই ইউআই বা প্রধান থ্রেড অবিচ্ছিন্নভাবে কাজ চালিয়ে যেতে পারে।
- Improved performance: একাধিক কাজ একসাথে পরিচালনা করা সম্ভব, যেমন নেটওয়ার্ক কল বা ডাটাবেস এক্সিকিউশন, যা থ্রেডের কার্যকারিতা উন্নত করে।
- Easy callback management: Guava এর
ListenableFutureএবংFutures.addCallback()মেথড সহজে ক্যালব্যাক হ্যান্ডলিং বাস্তবায়ন করতে সহায়তা করে।
সারাংশ
Guava লাইব্রেরি Async Execution এবং Callback Handling এর জন্য শক্তিশালী এবং সহজ টুল সরবরাহ করে। ListenableFuture এবং ListeningExecutorService এর মাধ্যমে অ্যাসিঙ্ক্রোনাস কাজগুলির কার্যকরী বাস্তবায়ন এবং ফলাফল পাওয়ার পরে ক্যালব্যাক হ্যান্ডলিং করা সম্ভব। এই ফিচারগুলির মাধ্যমে আপনি আপনার অ্যাপ্লিকেশনের পারফরম্যান্স উন্নত করতে পারেন এবং আরও মসৃণ এবং দ্রুত কার্যকারিতা নিশ্চিত করতে পারবেন।
Read more