exécuter : utilisez-le pour tirer et oublier les appels
submit : utilisez-le pour inspecter le résultat de l'appel de méthode et prendre les mesures appropriées sur l'objetFuture
renvoyé par l'appel
de javadocs
submit(Callable<T> task)
Soumet une tâche de renvoi de valeur pour exécution et renvoie un Future représentant les résultats en attente de la tâche.
Future<?> submit(Runnable task)
Soumet une tâche exécutable pour exécution et renvoie un Future représentant cette tâche.
void execute(Runnable command)
Exécute la commande donnée à un moment donné dans le futur. La commande peut s'exécuter dans un nouveau thread, dans un thread groupé ou dans le thread appelant, à la discrétion de l'implémentation Executor.
Vous devez prendre des précautions lors de l'utilisation submit()
. Il masque l'exception dans le cadre lui-même, sauf si vous incorporez votre code de tâche dans un try{} catch{}
bloc.
Exemple de code: Ce code avale 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();
}
}
production:
java ExecuteSubmitDemo
creating service
a and b=4:0
Le même code lève en remplaçant submit()
par execute
():
Remplacer
service.submit(new Runnable(){
avec
service.execute(new Runnable(){
production:
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)
Comment gérer ces types de scénarios lors de l'utilisation de submit ()?
- Intégrez votre code de tâche ( implémentation exécutable ou appelable) avec le code de bloc try {} catch {}
- Mettre en place
CustomThreadPoolExecutor
Nouvelle solution:
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);
}
}
production:
java ExecuteSubmitDemo
creating service
a and b=4:0
java.lang.ArithmeticException: / by zero
Runnable
dans unTask
, sur lequel vous n'avez peut-être aucun contrôle. Par exemple, si votreExecutor
est en fait unScheduledExecutorService
, votre tâche sera encapsulée en interne dans aFuture
et les non interceptésThrowable
seront liés à cet objet.