Quelle est la différence entre ExecutorService.soumettre et ExecutorService.exécuter dans le présent code en Java?

Je suis en train d'apprendre à utiliser ExectorService à la piscine threads et d'envoyer des tâches. J'ai un simple programme ci-dessous

import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
class Processor implements Runnable {
private int id;
public Processor(int id) {
this.id = id;
}
public void run() {
System.out.println("Starting: " + id);
try {
Thread.sleep(5000);
} catch (InterruptedException e) {
System.out.println("sorry, being interupted, good bye!");
System.out.println("Interrupted "+Thread.currentThread().getName());
e.printStackTrace();    
}
System.out.println("Completed: " + id);
}
}
public class ExecutorExample {
public static void main(String[] args) {
Boolean isCompleted=false;
ExecutorService executor = Executors.newFixedThreadPool(2);
for(int i=0; i<5; i++) {
executor.execute(new Processor(i));
}
//executor does not accept any more tasks but the submitted tasks continue
executor.shutdown();
System.out.println("All tasks submitted.");
try {
//wait for the exectutor to terminate normally, which will return true
//if timeout happens, returns false, but this does NOT interrupt the threads
isCompleted=executor.awaitTermination(100, TimeUnit.SECONDS);
//this will interrupt thread it manages. catch the interrupted exception in the threads 
//If not, threads will run forever and executor will never be able to shutdown.
executor.shutdownNow();
} catch (InterruptedException e) {
}
if (isCompleted){
System.out.println("All tasks completed.");
}
else {
System.out.println("Timeout "+Thread.currentThread().getName());
}
}
}

Il ne fait rien de fantaisie, mais crée deux threads et présente 5 tâches au total. Après chaque thread termine sa tâche, il prend le prochain,
Dans le code ci-dessus, j'utilise executor.submit. J'ai aussi changé de executor.execute. Mais je ne vois pas la différence dans la sortie. En quoi les submit and execute méthodes différentes?
Ce que la API dit

Méthode soumettre s'étend de la base de la méthode de l'Exécuteur testamentaire.execute(java.lang.Runnable) par la création et le retour d'un Avenir qui peut être utilisé pour annuler l'exécution et/ou de patienter. Méthodes invokeAny et invokeAll effectuer le plus couramment formes utiles de la masse de l'exécution, l'exécution d'une collection de tâches, puis attendre au moins un, ou tous, pour compléter. (Classe ExecutorCompletionService peut être utilisé pour écrire personnalisé variantes de ces méthodes.)

Mais ce n'est pas clair pour moi que ce que cela signifie exactement?

InformationsquelleAutor brain storm | 2013-09-10