2014-07-22 10 views
9

Desidero rendere il thread in attesa per 30 minuti. Ci sono dei problemi nel fare questo?Rendere un thread in sospeso per 30 minuti

+1

Sì, ci sono tonnellate di problemi, perché il filo non farà nulla per 30 minuti. 'Thread.sleep (1000 * 60 * 30);', e avvolgilo in un try-catch – Kon

+5

invece di dormire un thread prova a usare il timer. –

+0

Cosa stai cercando di realizzare? E 'solo per giocare con i fili? – chrylis

risposta

17

È possibile rendere il vostro sonno filo per 30 minuti come questo:

Thread.sleep(30 * // minutes to sleep 
      60 * // seconds to a minute 
      1000); // milliseconds to a second 

utilizzando Thread.sleep non è intrinsecamente cattivo. Semplicemente spiegato, dice semplicemente allo scheduler di thread di anticipare il thread. Thread.sleep non è corretto se utilizzato in modo errato.

  • Dormire senza rilasciare (condivisi) risorse: se il filo è a letto con una connessione di database aperto da un pool di connessione condivisa, o un gran numero di oggetti in memoria, altri thread non possono utilizzare queste risorse. Queste risorse vengono sprecate fintanto che il thread dorme.
  • Utilizzato per impedire race conditions: A volte potresti essere in grado di risolvere praticamente una condizione di gara introducendo un sleep. Ma questo non è un modo garantito. Usa un mutex. Vedi Is there a Mutex in Java?
  • Come timer garantito: la durata di riposo di Thread.sleep non è garantita. Potrebbe tornare prematuramente con uno InterruptedException. O potrebbe dormire troppo.

    Da documentation:

    public static void sleep(long millis) throws InterruptedException 
    

    causa il thread attualmente in esecuzione a dormire (cessare temporaneamente l'esecuzione) per il numero specificato di millisecondi, soggetta alla precisione e l'accuratezza di timer di sistema e utilità di pianificazione .


Si potrebbe anche usare, come kozla13 ha dimostrato nel loro commento:

TimeUnit.MINUTES.sleep(30); 
+5

soluzione migliore: TimeUnit.MINUTES.sleep (30); – kozla13

1

La risposta di Krumia già mostra perfettamente come dormire un running Thread. A volte, il requisito di sospendere o sospendere un thread deriva dal desiderio di eseguire un'operazione in un secondo momento. Se questo è il caso, è meglio usare un concetto di livello superiore come Timer o ScheduledExecutorService:

ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor(); 
executor.schedule(operation, 30, TimeUnit.MINUTES); 

Dove operation è la Runnable che si desidera eseguire in 30 minuti.

Utilizzando un ScheduledExecutorService, è anche possibile eseguire operazioni periodicamente:

// start in 10 minutes to run the operation every 30 minutes 
executor.scheduleAtFixedDelay(operation, 10, 30, TimeUnit.MINUTES);