2014-07-22 13 views
9

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

+1

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

+5

zamiast spania w wątku spróbuj użyć timera. –

+0

Co próbujesz osiągnąć? Czy to po prostu grać z wątkami? – chrylis

Odpowiedz

17

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 z InterruptedException. 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); 
+5

lepsze rozwiązanie: TimeUnit.MINUTES.sleep (30); – kozla13

1

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); 
Powiązane problemy