निष्पादित : यह आग और भूल कॉल के लिए उपयोग करें
सबमिट करें: विधि कॉल के परिणाम का निरीक्षण करने और कॉलFuture
द्वारा लौटाए गए ऑब्जेक्टपर उचित कार्रवाई करने के लिए इसका उपयोगकरें
से javadocs
submit(Callable<T> task)
निष्पादन के लिए एक मूल्य-वापसी कार्य प्रस्तुत करता है और कार्य के लंबित परिणामों का प्रतिनिधित्व करते हुए एक भविष्य देता है।
Future<?> submit(Runnable task)
निष्पादन के लिए एक रनाने योग्य कार्य प्रस्तुत करता है और उस कार्य का प्रतिनिधित्व करने वाला भविष्य देता है।
void execute(Runnable command)
भविष्य में किसी समय दिए गए आदेश को निष्पादित करता है। आदेश क्रियान्वयन के विवेक पर, एक नए थ्रेड में, एक थ्रेडेड थ्रेड में या कॉलिंग थ्रेड में निष्पादित हो सकता है।
उपयोग करते समय आपको एहतियात बरतनी होगी submit()
। जब तक आप अपने कार्य कोड को try{} catch{}
ब्लॉक में एम्बेड नहीं करते हैं, तब तक यह फ्रेमवर्क में अपवाद को छिपा देता है।
उदाहरण कोड: यह कोड निगल जाता है Arithmetic exception : / by zero
।
import java.util.concurrent.*;
import java.util.*;
public class ExecuteSubmitDemo{
public ExecuteSubmitDemo()
{
System.out.println("creating service");
ExecutorService service = Executors.newFixedThreadPool(10);
//ExtendedExecutor service = new ExtendedExecutor();
service.submit(new Runnable(){
public void run(){
int a=4, b = 0;
System.out.println("a and b="+a+":"+b);
System.out.println("a/b:"+(a/b));
System.out.println("Thread Name in Runnable after divide by zero:"+Thread.currentThread().getName());
}
});
service.shutdown();
}
public static void main(String args[]){
ExecuteSubmitDemo demo = new ExecuteSubmitDemo();
}
}
उत्पादन:
java ExecuteSubmitDemo
creating service
a and b=4:0
() के submit()
साथ प्रतिस्थापित करके समान कोड फेंकता है execute
:
बदलने के
service.submit(new Runnable(){
साथ में
service.execute(new Runnable(){
उत्पादन:
java ExecuteSubmitDemo
creating service
a and b=4:0
Exception in thread "pool-1-thread-1" java.lang.ArithmeticException: / by zero
at ExecuteSubmitDemo$1.run(ExecuteSubmitDemo.java:14)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
सबमिट () का उपयोग करते समय इस प्रकार के परिदृश्यों को कैसे संभालें?
- प्रयास करें {} कैच {} ब्लॉक कोड के साथ अपना टास्क कोड ( या तो रन करने योग्य या कॉल करने योग्य कार्यान्वयन) को एम्बेड करें
- लागू
CustomThreadPoolExecutor
नया समाधान:
import java.util.concurrent.*;
import java.util.*;
public class ExecuteSubmitDemo{
public ExecuteSubmitDemo()
{
System.out.println("creating service");
//ExecutorService service = Executors.newFixedThreadPool(10);
ExtendedExecutor service = new ExtendedExecutor();
service.submit(new Runnable(){
public void run(){
int a=4, b = 0;
System.out.println("a and b="+a+":"+b);
System.out.println("a/b:"+(a/b));
System.out.println("Thread Name in Runnable after divide by zero:"+Thread.currentThread().getName());
}
});
service.shutdown();
}
public static void main(String args[]){
ExecuteSubmitDemo demo = new ExecuteSubmitDemo();
}
}
class ExtendedExecutor extends ThreadPoolExecutor {
public ExtendedExecutor() {
super(1,1,60,TimeUnit.SECONDS,new ArrayBlockingQueue<Runnable>(100));
}
// ...
protected void afterExecute(Runnable r, Throwable t) {
super.afterExecute(r, t);
if (t == null && r instanceof Future<?>) {
try {
Object result = ((Future<?>) r).get();
} catch (CancellationException ce) {
t = ce;
} catch (ExecutionException ee) {
t = ee.getCause();
} catch (InterruptedException ie) {
Thread.currentThread().interrupt(); // ignore/reset
}
}
if (t != null)
System.out.println(t);
}
}
उत्पादन:
java ExecuteSubmitDemo
creating service
a and b=4:0
java.lang.ArithmeticException: / by zero
Runnable
लपेटा गया हैTask
या नहीं, जिस पर आपका कोई नियंत्रण नहीं है। उदाहरण के लिए, यदि आपकाExecutor
वास्तव में एक हैScheduledExecutorService
, तो आपका कार्य आंतरिक रूप से एक मेंFuture
लिपटेगा और अनकहाThrowable
एस इस ऑब्जेक्ट के लिए बाध्य होगा।