2013-11-01 13 views
10

Ho un ciclo while e voglio che esca dopo un po 'di tempo.Come uscire da un ciclo while dopo un certo tempo?

Ad esempio:

while(condition and 10 sec has not passed){ 

} 
+3

Dalla mia ipotesi, ciò che si sta cercando è questo: http://stackoverflow.com/questions/4252187/ how-to-stop-execution-after-a-certain-time-in-java # answer-4252197 – sPaz

risposta

22
long startTime = System.currentTimeMillis(); //fetch starting time 
while(false||(System.currentTimeMillis()-startTime)<10000) 
{ 
    // do something 
} 

Così la dichiarazione

(System.currentTimeMillis()-startTime)<10000 

Verifica se è stato 10 secondi o 10.000 millisecondi dal momento che il ciclo iniziato.

EDIT

Come @Julien sottolineato, questo potrebbe non riuscire se il blocco di codice all'interno del ciclo, mentre prende un sacco di time.Thus usando ExecutorService sarebbe una buona opzione.

Prima dovremmo implementare Runnable

class MyTask implements Runnable 
{ 
    public void run() { 
     // add your code here 
    } 
} 

Poi possiamo usare ExecutorService come questo,

ExecutorService executor = Executors.newSingleThreadExecutor(); 
executor.invokeAll(Arrays.asList(new MyTask()), 10, TimeUnit.SECONDS); // Timeout of 10 seconds. 
executor.shutdown(); 
+1

Come spiegato nella mia risposta, questo codice non farà il trucco. Può essere eseguito indefinitamente se il codice nel ciclo richiede un tempo infinito. – Julien

+0

Grazie, vedere la modifica. –

7

Qualcosa di simile:

long start_time = System.currentTimeMillis(); 
long wait_time = 10000; 
long end_time = start_time + wait_time; 

while (System.currentTimeMillis() < end_time) { 
    //.. 
} 

dovrebbe fare il trucco. Se hai bisogno anche di altre condizioni, aggiungili all'istruzione while.

10

soluzioni proposte e accettate non farà il trucco.

Non interrompe il ciclo dopo 10 secondi. Immagina che il codice nel tuo ciclo impieghi 20 secondi per essere elaborato e venga chiamato a 9,9 secondi. Il tuo codice uscirà dopo 29.9 secondi di esecuzione.

Se si desidera arrestare esattamente dopo 10 secondi, è necessario eseguire il codice in un thread esterno che verrà eliminato dopo un determinato timeout.

soluzioni esistenti sono già state proposte here e there

0

Non utilizzare questo

System.currentTimeMillis()-startTime 

Essa può causare appendere cambiamento del tempo macchina host. Migliore utilizzo in questo modo:

Integer i = 0; 
      try { 
       while (condition && i++ < 100) { 
        Thread.sleep(100); 
       } 
      } catch (InterruptedException e) { 
       e.printStackTrace(); 
      } 

(100 * 100 = 10 sec timeout)

Problemi correlati