Chcę, aby mój wątek czekał przez 30 minut. Czy są jakieś problemy z tym związane?Tworzenie wątku do spania przez 30 minut
Odpowiedz
Można dokonać snu nici przez 30 minut jak ten:
Thread.sleep(30 * // minutes to sleep
60 * // seconds to a minute
1000); // milliseconds to a second
Korzystanie Thread.sleep
nie jest z natury zły. Po prostu wyjaśniono, po prostu informuje program planujący wątek, aby zwrócił uwagę na wątek. Thread.sleep
jest zły, gdy jest niewłaściwie używany.
- Spanie bez zwalniania (wspólny) Zasoby: Jeśli wątek śpi z otwartym połączenia z bazą danych ze wspólnej puli połączeń, lub dużej liczby obiektów w pamięci, inne wątki nie mogą korzystać z tych zasobów. Te zasoby są marnowane, dopóki wątek śpi.
- Używany do zapobiegania race conditions: Czasami możesz praktycznie rozwiązać problem wyścigu, wprowadzając
sleep
. Ale to nie jest gwarantowany sposób. Użyj muteksu. Patrz Is there a Mutex in Java? Jako gwarantowany czasomierz: Czas spoczynku
Thread.sleep
nie jest gwarantowany. Może wrócić przedwcześnie zInterruptedException
. Lub może zaspać.Od documentation:
public static void sleep(long millis) throws InterruptedException
Powoduje wątek aktualnie wykonywanego spać (tymczasowo zaprzestać wykonywania) dla określonej liczby milisekund, zastrzeżeniem precyzji i dokładności zegarów i planiści systemowych .
Można również wykorzystać, jako kozla13 wykazał w swoim komentarzu:
TimeUnit.MINUTES.sleep(30);
lepsze rozwiązanie: TimeUnit.MINUTES.sleep (30); – kozla13
Odpowiedź Krumia już doskonale pokazuje, jak spać uruchomioną Thread
. Czasami wymóg snu lub wstrzymania wątku pochodzi z chęci wykonania operacji w późniejszym terminie. Jeśli tak jest, należy lepiej wykorzystać wyższy poziom pojęcia jak Timer
lub ScheduledExecutorService
:
ScheduledExecutorService executor = Executors.newSingleThreadScheduledExecutor();
executor.schedule(operation, 30, TimeUnit.MINUTES);
Gdzie operation
jest Runnable
chcesz wykonać w 30 minut.
Korzystanie ScheduledExecutorService
, można również wykonywać operacje okresowo:
// start in 10 minutes to run the operation every 30 minutes
executor.scheduleAtFixedDelay(operation, 10, 30, TimeUnit.MINUTES);
Tak, istnieje mnóstwo problemów, ponieważ nitka zrobi nic przez 30 minut. 'Thread.sleep (1000 * 60 * 30);' i zapakuj go w try-catch – Kon
zamiast spania w wątku spróbuj użyć timera. –
Co próbujesz osiągnąć? Czy to po prostu grać z wątkami? – chrylis