Sto imparando a utilizzare exectorServices
per raggruppare threads
e inviare attività. Ho un semplice programma sottodifferenza tra executor.submit ed executor.execute in questo codice in Java?
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());
}
}
}
Lo fa niente di speciale, ma crea due threads
e presenta 5 funzioni in totale. Dopo che ogni thread
completa il suo compito, prende il successivo, Nel codice sopra, io uso executor.submit
. Ho anche cambiato in executor.execute
. Ma non vedo alcuna differenza nell'output. In che modo i metodi submit and execute
sono diversi? questo ciò che il API
dice
metodo di invio estende il metodo di base Executor.execute (java.lang.Runnable) creando e restituendo un futuro che può essere utilizzato per annullare l'esecuzione e/o attendere per il completamento. I metodi invokeAny e invokeAll eseguono le forme più comuni di esecuzione di massa, eseguendo una raccolta di attività e quindi aspettando che ne venga completato almeno uno o tutti. (Class ExecutorCompletionService può essere utilizzato per scrivere varianti personalizzate di questi metodi.)
Ma non mi è chiaro cosa significhi esattamente? Grazie
domanda utile. Ha valore per postarlo qui. – MKod