निष्पादक, निष्पादक सेवा, निष्पादक - 1

"हाय, अमीगो!"

"कुछ भी सही नहीं है जब इसे पहली बार बनाया गया है। थ्रेड्स के बारे में भी यही सच है। समय के साथ, जावा के निर्माता रननेबल इंटरफ़ेस की कमियों के प्रति आश्वस्त हो गए। यह अपवादों को फेंकने का समर्थन नहीं करता था और इसका पता लगाना संभव नहीं था। कार्यों के निष्पादन का परिणाम ..."

"रननेबल इंटरफ़ेस छोटे उप-कार्यों की तुलना में बड़े स्वतंत्र कार्यों के लिए अधिक उपयुक्त है, जिन्हें आप एक समय में एक दर्जन चलाना चाहते हैं, और फिर उनके परिणाम एकत्र करते हैं।"

"यही कारण है कि कॉल करने योग्य इंटरफ़ेस का आविष्कार किया गया था। यह रननेबल और थ्रेड की तुलना में छोटे कार्यों के समानांतर निष्पादन के लिए बेहतर अनुकूल है, क्योंकि यह एक सामान्य इंटरफ़ेस है।"

"यहां इंटरफ़ेस का एक विशिष्ट कार्यान्वयन है:"

उदाहरण
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();
 }
}

" रननेबल के विपरीत, यहां हमें कॉल विधि को ओवरराइड करने की आवश्यकता है, जो टाइप तर्क द्वारा निर्दिष्ट प्रकार का परिणाम देता है। यह दृष्टिकोण रननेबल इंटरफ़ेस की रन विधि की तुलना में अधिक सुविधाजनक है, जो शून्य लौटाता है। कभी-कभी डेवलपर्स को साथ आना पड़ता था। थ्रेड के परिणाम प्राप्त करने के लिए विभिन्न वर्कअराउंड।"

"अच्छा ऐसा है।"

"और अब देखें कि कॉल करने योग्य थ्रेडपूल एक्ज़ीक्यूटर के साथ कैसे काम कर सकता है:

"सबसे पहले, थ्रेडपूल एक्ज़ीक्यूटर क्लास की सबमिट विधि एक पैरामिट्रीकृत फ्यूचर ऑब्जेक्ट लौटाती है। आप इस ऑब्जेक्ट का उपयोग यह पता लगाने के लिए कर सकते हैं कि क्या कोई कार्य समाप्त हो गया है और परिणाम प्राप्त करने के लिए।"

"यह ऐसे काम करता है:"

उदाहरण
// 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;
कॉल विधि का परिणाम लौटाता है या यदि कोई अपवाद होता है तो उसे फेंक देता है।

"अच्छा! तो आप कार्यों को रोक भी सकते हैं।"

"इस पर बहुत अधिक भरोसा न करें—हर थ्रेड रुक नहीं सकता। लेकिन यदि कोई कार्य अभी भी कतार में है, तो यह ठीक काम करेगा।"

"मुझे यह दृष्टिकोण पसंद है। यह स्वयं धागे बनाने और फिर उनमें से परिणाम निकालने का प्रयास करने से कहीं अधिक सुविधाजनक है।"

"बहुत बढ़िया। आज का अंत यहीं पर होगा।"