Ausführen : Verwenden Sie es für Feuer und vergessen Sie Anrufe
submit : Verwenden Sie diese Option, um das Ergebnis des Methodenaufrufs zu überprüfen und geeignete Maßnahmen fürFuture
vom Aufruf zurückgegebene Objekte zuergreifen
Von Javadocs
submit(Callable<T> task)
Sendet eine wertrückgebende Aufgabe zur Ausführung und gibt eine Zukunft zurück, die die ausstehenden Ergebnisse der Aufgabe darstellt.
Future<?> submit(Runnable task)
Sendet eine ausführbare Aufgabe zur Ausführung und gibt eine Zukunft zurück, die diese Aufgabe darstellt.
void execute(Runnable command)
Führt den angegebenen Befehl zu einem späteren Zeitpunkt aus. Der Befehl kann nach Ermessen der Executor-Implementierung in einem neuen Thread, in einem Pool-Thread oder im aufrufenden Thread ausgeführt werden.
Sie müssen bei der Verwendung Vorsichtsmaßnahmen treffen submit()
. Es verbirgt Ausnahmen im Framework selbst, es sei denn, Sie binden Ihren Aufgabencode in try{} catch{}
Block ein.
Beispielcode: Dieser Code schluckt 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();
}
}
Ausgabe:
java ExecuteSubmitDemo
creating service
a and b=4:0
Gleicher Code wird durch Ersetzen submit()
durch execute
() ausgelöst :
Ersetzen
service.submit(new Runnable(){
mit
service.execute(new Runnable(){
Ausgabe:
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)
Wie gehe ich mit solchen Szenarien um, wenn ich submit () verwende?
- Betten Sie Ihren Task-Code ( entweder ausführbare oder aufrufbare Implementierung) in den Blockcode try {} catch {} ein
- Implementieren
CustomThreadPoolExecutor
Neue Lösung:
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);
}
}
Ausgabe:
java ExecuteSubmitDemo
creating service
a and b=4:0
java.lang.ArithmeticException: / by zero
Runnable
in ein System eingewickelt werdenTask
oder nicht, über das Sie möglicherweise keine Kontrolle haben. Wenn SieExecutor
beispielsweise tatsächlich eine sindScheduledExecutorService
, wird Ihre Aufgabe intern in eine eingeschlossen,Future
und nicht erfassteThrowable
s werden an dieses Objekt gebunden.