Desidero rendere il thread in attesa per 30 minuti. Ci sono dei problemi nel fare questo?Rendere un thread in sospeso per 30 minuti
risposta
È 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 unoInterruptedException
. 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);
soluzione migliore: TimeUnit.MINUTES.sleep (30); – kozla13
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);
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
invece di dormire un thread prova a usare il timer. –
Cosa stai cercando di realizzare? E 'solo per giocare con i fili? – chrylis