Próbuję zrobić coś w Javie i potrzebuję czegoś do oczekiwania / opóźnienia na kilka sekund w pętli while.
while (true) {
if (i == 3) {
i = 0;
}
ceva[i].setSelected(true);
// I need to wait here
ceva[i].setSelected(false);
// I need to wait here
i++;
}
Chcę zbudować sekwencer kroków i jestem nowy w Javie. Jakieś sugestie?
java
wait
sleep
thread-sleep
ardb
źródło
źródło
Thread.Sleep()
.Thread.sleep(<milisecondsToSleep>)
. Nies
należy wielkich liter.Odpowiedzi:
Jeśli chcesz wstrzymać, użyj
java.util.concurrent.TimeUnit
:Spać przez sekundę lub
Spać 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
.Co więcej,
sleep
nie jest zbyt elastyczny, jeśli chodzi o kontrolę.Aby uruchamiać zadanie co sekundę lub z jednosekundowym opóźnieniem, zdecydowanie zaleciłbym a
ScheduledExecutorService
i alboscheduleAtFixedRate
lubscheduleWithFixedDelay
.Na przykład, aby uruchomić metodę
myTask
co sekundę (Java 8):A w Javie 7:
źródło
TimeUnit.SECONDS.wait(1)
rzucaIllegalMonitorStateException
w Java 8.1 build 31 na Windows 6.3. Zamiast tego mogę używaćThread.sleep(1000)
bez próbowania / łapania.Unhandled exception: java.lang.InterruptedExecution
zasleep(1)
TimeUnit.SECONDS.sleep(1);
ztry catch
Użyj
Thread.sleep(1000)
;1000
to liczba milisekund, które program zatrzyma.źródło
Musisz użyć
Thread.sleep()
połączenia.Więcej informacji tutaj: http://docs.oracle.com/javase/tutorial/essential/concurrency/sleep.html
źródło
Użyj tego:
możesz wywołać tę metodę w dowolnym miejscu, np .:
źródło
Używanie
TimeUnit.SECONDS.sleep(1);
lubThread.sleep(1000);
akceptowalny sposób to zrobić. W obu przypadkach musisz złapać,InterruptedException
co sprawia, że twój kod jest nieporęczny. Istnieje biblioteka Java Open Source o nazwie MgntUtils (napisana przeze mnie), która zapewnia narzędzie, które już zajmuje sięInterruptedException
wewnątrz. Twój kod zawiera więc tylko jedną linię:Zobacz javadoc tutaj . Możesz uzyskać dostęp do biblioteki z Maven Central lub z Github . Artykuł wyjaśniający o bibliotece można znaleźć tutaj
źródło
catch (InterruptedException e) { /* empty */ }
jest tutaj rozsądnym rozwiązaniem. Przynajmniej powinieneś podać jakieś informacje z dziennika. Aby uzyskać więcej informacji na ten temat, zobacz javaspecialists.eu/archive/Issue056.htmlPosługiwać się
Thread.sleep(100);
. Jednostką czasu są milisekundyNa przykład:
źródło
Wiem, że jest to bardzo stary post, ale może to komuś pomóc: możesz utworzyć metodę, więc za każdym razem, gdy musisz zrobić pauzę, możesz wpisać
pause(1000)
dowolną inną milisekundę:Zostało to wstawione tuż nad
public static void main(String[] args)
klasą. Następnie, aby wywołać metodę, wpisz,pause(ms)
ale zamień,ms
liczbę milisekund do wstrzymania. W ten sposób nie musisz wstawiać całej instrukcji try-catch, gdy chcesz wstrzymać.źródło