এক্সিকিউটর, এক্সিকিউটর সার্ভিস, এক্সিকিউটর- ১

"হাই, অ্যামিগো!"

"কোন কিছুই নিখুঁত নয় যখন এটি প্রথম তৈরি করা হয়। থ্রেডের ক্ষেত্রেও এটি সত্য। সময়ের সাথে সাথে, জাভার নির্মাতারা রানেবল ইন্টারফেসের ত্রুটিগুলি সম্পর্কে নিশ্চিত হয়েছিলেন। এটি থ্রো করার ব্যতিক্রমগুলিকে সমর্থন করে না এবং এটি খুঁজে বের করা সম্ভব করেনি। কার্য সম্পাদনের ফলাফল..."

"চালানযোগ্য ইন্টারফেসটি ছোট সাবটাস্কগুলির চেয়ে বড় স্বাধীন কাজের জন্য বেশি উপযুক্ত যা আপনি একবারে এক ডজন চালাতে চান এবং তারপরে তাদের ফলাফল সংগ্রহ করতে চান।"

"এ কারণেই কলেবল ইন্টারফেসটি উদ্ভাবিত হয়েছিল। এটি রানেবল এবং থ্রেডের তুলনায় ছোট কাজগুলির সমান্তরাল সম্পাদনের জন্য অনেক বেশি উপযুক্ত, কারণ এটি একটি জেনেরিক ইন্টারফেস।"

"এখানে ইন্টারফেসের একটি সাধারণ বাস্তবায়ন:"

উদাহরণ
class ReverseString implements Callable<String>
{
 String str;

 ReverseString(String str)
 {
  this.str = str;
 }

 public String call() throws Exception
 {
  StringBuilder builder = new StringBuilder(str);
  builder.reverse();
  return builder.toString();
 }
}

" Runnable এর বিপরীতে, এখানে আমাদের কল মেথডকে ওভাররাইড করতে হবে, যা টাইপ আর্গুমেন্টের দ্বারা নির্দিষ্ট টাইপের ফলাফল প্রদান করে। এই পদ্ধতিটি Runnable ইন্টারফেসের রান পদ্ধতির চেয়ে অনেক বেশি সুবিধাজনক, যা অকার্যকর রিটার্ন করে। কখনও কখনও ডেভেলপারদের সাথে আসতে হয়। একটি থ্রেডের ফলাফল পেতে বিভিন্ন সমাধান।"

"আমি দেখি."

"এবং এখন দেখুন কিভাবে Callable ThreadPoolExecutor এর সাথে একসাথে কাজ করতে পারে:

"প্রথম, ThreadPoolExecutor ক্লাসের সাবমিট পদ্ধতি একটি প্যারামিটারাইজড ফিউচার অবজেক্ট রিটার্ন করে। আপনি এই অবজেক্টটি ব্যবহার করে একটি টাস্ক শেষ হলে এবং ফলাফল পেতে পারেন কিনা তা খুঁজে বের করতে পারেন।"

"এখানে কিভাবে এটা কাজ করে:"

উদাহরণ
// 1. Create a ThreadPoolExecutor
ExecutorService service = Executors.newFixedThreadPool(5);

// 2. Add a task to it
Future<String> task = service.submit(new ReverseString("Amigo"));

// 3. Wait until the task is done
while(!task.isDone())
{
 Thread.sleep(1);
}

// 4. Try to get the result
//We will get either the result, or an exception if one occurred while the task was being executed
try
{
 System.out.println("Full string : " + task.get());
}
catch (Exception ie)
{
 ie.printStackTrace(System.err);
}

// 5. Stop the ThreadPool.
service.shutdown();

"দূরের বাইরে! আমি বিশেষ করে ফিউচার ক্লাস পছন্দ করি। এর কি পদ্ধতি আছে?"

"এখানে সবচেয়ে আকর্ষণীয়:"

পদ্ধতি বর্ণনা
boolean cancel(boolean mayInterrupt);
কাজ বন্ধ করে দেয়।
boolean isCancelled();
টাস্ক বন্ধ করা হলে সত্য ফেরত দেয়।
boolean isDone();
কার্য সম্পাদন করা হলে সত্য ফেরত দেয়।
V get() throws InterruptedException, ExecutionException;
কল পদ্ধতির ফলাফল প্রদান করে বা যদি একটি ঘটে থাকে তবে একটি ব্যতিক্রম ছুড়ে দেয়।

"ঠান্ডা! তাই আপনিও কাজ বন্ধ করতে পারেন।"

"এটির উপর খুব বেশি নির্ভর করবেন না - প্রতিটি থ্রেড থামতে পারে না। তবে যদি একটি কাজ এখনও সারিতে থাকে তবে এটি ভাল কাজ করবে।"

"আমি এই পদ্ধতি পছন্দ করি। এটি নিজে থ্রেড তৈরি করার চেয়ে অনেক বেশি সুবিধাজনক এবং তারপরে সেগুলি থেকে একটি ফলাফল বের করার চেষ্টা করে।"

"দারুণ। এখানেই আমরা আজকে শেষ করব।"