एक्झिक्युटर, एक्झिक्युटर सर्व्हिस, एक्झिक्यूटर - १

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

"जेव्हा ते पहिल्यांदा तयार केले जाते तेव्हा कोणतीही गोष्ट परिपूर्ण नसते. थ्रेड्सच्या बाबतीतही हेच खरे आहे. कालांतराने, Java च्या निर्मात्यांना रन करण्यायोग्य इंटरफेसच्या कमतरतांबद्दल खात्री पटली. ते थ्रोइंग अपवादांना समर्थन देत नाही आणि ते शोधणे शक्य झाले नाही. कार्ये पूर्ण केल्याचे परिणाम..."

"तुम्ही एकावेळी डझनभर चालवू इच्छित असलेल्या छोट्या सबटास्कपेक्षा मोठ्या स्वतंत्र कार्यांसाठी रन करण्यायोग्य इंटरफेस अधिक योग्य आहे आणि नंतर त्यांचे परिणाम संकलित करा."

"म्हणूनच कॉल करण्यायोग्य इंटरफेसचा शोध लावला गेला. रन करण्यायोग्य आणि थ्रेडपेक्षा लहान कार्यांच्या समांतर अंमलबजावणीसाठी ते अधिक अनुकूल आहे , कारण तो एक सामान्य इंटरफेस आहे."

"इंटरफेसची येथे एक सामान्य अंमलबजावणी आहे:"

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

" रननेबलच्या विपरीत, येथे आम्हाला कॉल पद्धत ओव्हरराइड करणे आवश्यक आहे, जी टाइप आर्ग्युमेंटद्वारे निर्दिष्ट केलेल्या प्रकाराचा परिणाम देते. हा दृष्टीकोन रननेबल इंटरफेसच्या रन पद्धतीपेक्षा अधिक सोयीस्कर आहे, जो शून्य परत करतो. थ्रेडचा निकाल मिळविण्यासाठी विविध उपाय."

"मी बघतो."

"आणि आता कॉलेबल 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;
कॉल पद्धतीचा परिणाम मिळवतो किंवा एखादा अपवाद आढळल्यास तो फेकतो.

"छान! म्हणजे तुम्ही टास्कही थांबवू शकता."

"यावर जास्त विसंबून राहू नका-प्रत्येक धागा थांबू शकत नाही. पण एखादे कार्य अजूनही रांगेत असेल तर ते चांगले चालेल."

"मला हा दृष्टीकोन आवडतो. स्वतः थ्रेड तयार करणे आणि नंतर त्यातून निकाल काढण्याचा प्रयत्न करण्यापेक्षा हे खूप सोयीचे आहे."

"छान. आज आपण तिथेच संपवू."