Leggere attentamente la domanda prima di contrassegnarla come duplicata.Chiamata di metodo ai blocchi Future.get(). È davvero desiderabile?
Di seguito è riportato lo snippet dello pseudo codice. La mia domanda è: il codice seguente non sconfigge la nozione stessa di elaborazione parallela asincrona?
Il motivo per cui lo chiedo è perché nel codice sottostante il thread principale dovrebbe inviare un'attività da eseguire in un thread diverso. Dopo aver inviato l'attività in coda, blocca il metodo Future.get() affinché l'attività restituisca il valore. Preferirei che l'attività fosse eseguita nella discussione principale anziché inviarla a un thread diverso e attendere i risultati. Che cosa ho ottenuto eseguendo l'attività in una nuova discussione?
Sono consapevole che è possibile attendere un tempo limitato, ecc., Ma che succede se mi interessa davvero del risultato? Il problema peggiora se ci sono più attività da eseguire. Mi sembra che stiamo semplicemente facendo il lavoro in modo sincrono. Sono a conoscenza della libreria Guava che fornisce un'interfaccia listener non bloccante. Ma sono interessato a sapere se la mia comprensione è corretta per l'API Future.get(). Se è corretto, perché il Future.get() è progettato per bloccare e quindi sconfiggere l'intero processo di elaborazione parallela?
Nota - Per la cronaca, io uso JAVA 6
public static void main(String[] args){
private ExectorService executorService = ...
Future future = executorService.submit(new Callable(){
public Object call() throws Exception {
System.out.println("Asynchronous Callable");
return "Callable Result";
}
});
System.out.println("future.get() = " + future.get());
}
L'idea è che si dovrebbe presentare più attività e poi aspettare. Hai ragione che se aspetti il risultato tra l'invio di ogni attività, allora saranno processati in serie e non otterrai nulla. –
@SkinnyJ Se più attività sono sottoposte, come fai a sapere il risultato restituito è per il quale compito? E come aspetto più compiti? –
@VishalP Si avrà quindi la lista dei Futures, che si potrebbe verificare con isDone() o fetch risultato con get() – John