Quando si utilizza un ExecutorService
e Future
oggetti (al momento della presentazione Runnable
compiti), se a specificare un valore di timeout per il futuro funzione get, fa il filo conduttore avere ucciso quando un TimeoutException
è gettata?Esiste un timeout futuro uccidere l'esecuzione Discussione
risposta
Non funziona. Perché dovrebbe? A meno che tu non lo dica.
C'è una preoccupazione molto valida qui nel caso di un Callable ad esempio. Se hai aspettato il risultato per 20 secondi e non l'hai ottenuto, non sei più interessato al risultato. A quel tempo dovresti assolutamente annullare l'operazione.
Qualcosa di simile a questo:
Future<?> future = service.submit(new MyCallable());
try {
future.get(100, TimeUnit.MILLISECONDS);
} catch (Exception e){
e.printStackTrace();
future.cancel(true); //this method will stop the running underlying task
}
No, non funziona. Inoltre, non c'è nemmeno alcun tentativo di interrompere il compito. Prima di tutto, Future.get con timeout non lo dice. In secondo luogo, provare la mia prova per vedere come si comporta
ExecutorService ex = Executors.newSingleThreadExecutor();
Future<?> f = ex.submit(new Runnable() {
public void run() {
try {
Thread.sleep(2000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("finished");
}
});
f.get(1, TimeUnit.SECONDS);
in 1 sec esso stampa
Exception in thread "main" java.util.concurrent.TimeoutException
at java.util.concurrent.FutureTask$Sync.innerGet(FutureTask.java:228)
at java.util.concurrent.FutureTask.get(FutureTask.java:91)
at Test1.main(Test1.java:23)
dopo l'altro 1 secondo il successfullt compito finisce
finished
Beh ... che * particolare * 'implementazione Future' non lo fa. Essendo un'interfaccia, non si possono fare affermazioni radicali su tutti i 'Futuri'. –
Future.get (long timeout, unità TimeUnit) non dice che tenterà di interrompere l'attività. Inoltre, ci sono molti modi per fermare un thread in esecuzione? –
Buona risposta, ritiro la mia denuncia! –
Sembra che avete bisogno di uccidere, annullare o arrestare l'attività in modo esplicito
- 1. Come fermare timeout di un futuro
- 2. Come aspettare e uccidere un processo di timeout in PowerShell
- 3. Uccidere o terminare un sottoprocesso durante il timeout?
- 4. Come uccidere un thread MFC?
- 5. uccidere un processo in bash
- 6. Come interrompere implicitamente una discussione in un oggetto in C#
- 7. interrompendo un timeout in reactjs?
- 8. mittente all'interno di un futuro
- 9. Ottenere un risultato nel futuro?
- 10. Come uccidere un processo C#?
- 11. Python: come posso ottenere una discussione per uccidersi dopo un timeout?
- 12. Android UnknownHostException: esiste un modo per impostare il timeout?
- 13. Esiste un timeout per le connessioni PostgreSQL inattive?
- 14. esiste un valore di timeout per socket.gethostbyname (hostname) in python?
- 15. Esiste un modo per attendere in modo asincrono un futuro in Boost Asio?
- 16. Conversione Metodo Scala @suspendable in un futuro
- 17. Come faccio a racchiudere un java.util.concurrent.Future in un futuro Akka?
- 18. Uccidere un processo creato con Python subprocess.Popen()
- 19. Il nome 'Discussione' non esiste nel contesto corrente
- 20. visibilità Discussione tra un processo
- 21. Come arrestare incondizionatamente una discussione
- 22. Quali sono i vantaggi di un futuro di Twitter su un futuro di Scala?
- 23. Quali sono le differenze tra un futuro di Scala e un futuro di Java
- 24. Python Timeout
- 25. Futuro [O [A, B]] a Futuro [O [A, C]] utilizzando una funzione (B => Futuro [C])
- 26. Boost Discussione - Come riconoscere interrompere
- 27. Esiste un constexpr nel nuovo standard C11 (non C++ 11) o pianificato in futuro?
- 28. Attesa futuro dall'esecutore: Futuro non può essere utilizzato nell'espressione 'attendi'
- 29. Futuro [Opzione [Futuro [Opzione [Booleano]] Semplificando Futures e Opzioni?
- 30. convertiamo il futuro di Scala nel futuro di Twitter
Solo un commento: 'future.cancel (true);' does ** not ** interrompe l'esecuzione dell'attività sottostante, imposta semplicemente il flag interrotto su true per il thread in esecuzione. È il tuo codice che è responsabile di controllare questo flag e lancia InterruptedException se è vero. –
@ThiagoKronig, sei sicuro? dalla [documentazione] (http://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#cancel (booleano)), se si passa true, il thread deve essere interrotto e il tentativo dovrebbe fallire. – Dirk
@Dirk, dalla documentazione disponibile: _Se l'attività è già stata avviata, il parametro mayInterruptIfRunning determina se il thread che esegue questa attività_ ** deve essere interrotto nel tentativo di interrompere l'attività **. _Interruption_ qui significa che verrà impostato su true un flag volatile di quel thread. Il codice in esecuzione deve verificare che questa condizione sia in grado di fermarsi. Il codice deve fermarsi. –