Próbowałem opóźnić - lub uśpić - mój program Java, ale wystąpił błąd.
Nie mogę użyć Thread.sleep(x)
lub wait()
. Pojawia się ten sam komunikat o błędzie:
niezgłoszony wyjątek java.lang.InterruptedException; musi zostać złapany lub ogłoszony wyrzuceniem.
Czy przed użyciem metod Thread.sleep()
lub jest wymagany jakiś krok wait()
?
Odpowiedzi:
Przed tobą dużo czytania. Od błędów kompilatora po obsługę wyjątków, wątkowanie i przerwy w wątkach. Ale zrobi to, co chcesz:
źródło
Jak powiedzieli inni użytkownicy, powinieneś otoczyć rozmowę
try{...} catch{...}
blokiem. Ale odkąd Java 1.5 została wydana, istnieje klasa TimeUnit, która robi to samo co Thread.sleep (millis), ale jest wygodniejsza. Możesz wybrać jednostkę czasu dla operacji snu.Ma także dodatkowe metody: Dokumentacja Oracle TimeUnit
źródło
try-catch
obsługą wyjątków.Spójrz na ten znakomity krótki post w jaki sposób zrobić to poprawnie.
Zasadniczo: złap
InterruptedException
. Pamiętaj, że musisz dodać ten blok catch. Post wyjaśnia to nieco dalej.źródło
Użyj poniższej konstrukcji kodowania do obsługi wyjątków
źródło
Umieść
Thread.sleep
blok próbnyźródło
Korzystając z Androida (jedynego razu, kiedy używam Javy), zaleciłbym użycie modułu obsługi zamiast uśpienia wątku.
Odniesienie: http://developer.android.com/reference/android/os/Handler.html
źródło
Spróbuj tego:
źródło
Exception
w Javie nie jest złą praktyką ?Moje sposoby na dodanie opóźnienia do programu Java.
Odnosi się to do sekwencyjnego opóźnienia, ale dla opóźnień w pętli patrz Java Delay / Wait .
źródło
na przykład:-
źródło
Prostszym sposobem oczekiwania jest użycie
System.currentTimeMillis()
, które zwraca liczbę milisekund od północy 1 stycznia 1970 roku UTC. Na przykład, aby poczekać 5 sekund:W ten sposób nie musisz grzebać w wątkach i wyjątkach. Mam nadzieję że to pomoże!
źródło
Użyj
java.util.concurrent.TimeUnit
:Śpij przez sekundę lub
Śpij przez minutę.
Ponieważ jest to pętla, stanowi to nieodłączny problem - dryf. Za każdym razem, gdy uruchamiasz kod, a następnie śpisz, trochę odpadasz od uruchamiania, powiedzmy, co sekundę. Jeśli jest to problem, nie używaj go
sleep
.Dalej,
sleep
nie jest zbyt elastyczny, jeśli chodzi o kontrolę.Do uruchamiania zadania co sekundę lub z jednosekundowym opóźnieniem zdecydowanie zalecam [
ScheduledExecutorService
] [1] i albo [scheduleAtFixedRate
] [2] albo [scheduleWithFixedDelay
] [3].Aby uruchomić metodę
myTask
co sekundę (Java 8):źródło
Thread.sleep()
jest prosty dla początkujących i może być odpowiedni do testów jednostkowych i weryfikacji koncepcji.Ale proszę NIE używać
sleep()
do kodu produkcyjnego. Ostateczniesleep()
może cię źle ugryźć.Najlepsza praktyka w przypadku wielowątkowych / wielordzeniowych aplikacji Java do korzystania z koncepcji „wątku oczekiwania”. Funkcja Wait zwalnia wszystkie blokady i monitory utrzymywane przez wątek, co pozwala innym wątkom na uzyskanie tych monitorów i kontynuowanie, gdy wątek śpi spokojnie.
Poniższy kod demonstruje tę technikę:
DelayUtil
realizacja:źródło
Alternatywnie, jeśli nie chcesz zajmować się wątkami, wypróbuj tę metodę:
Zaczyna się, gdy zadzwonisz, a kończy, gdy upłynie liczba sekund.
źródło