2013-04-26 13 views

risposta

38

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 
    } 
+13

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. –

+0

@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

+7

@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. –

14

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 
+1

Beh ... che * particolare * 'implementazione Future' non lo fa. Essendo un'interfaccia, non si possono fare affermazioni radicali su tutti i 'Futuri'. –

+6

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? –

+0

Buona risposta, ritiro la mia denuncia! –

Problemi correlati