Przepraszam za to powtarzające się pytanie, ale nie znalazłem jeszcze zadowalających odpowiedzi. Większość kwestii miał swój specyficzny przypadek użycia:
Java - alternative to thread.sleep
Is there any better or alternative way to skip/avoid using Thread.sleep(1000) in Java?Dlaczego Thread.sleep jest zły w użyciu
moje pytanie jest za bardzo rodzajowe przypadku użycia. Poczekaj na zakończenie warunku. Wykonaj jakąś operację. Sprawdź stan. Jeśli warunek nie jest spełniony, odczekaj chwilę i ponownie wykonaj tę samą operację.
Dla np. Rozważmy metodę, która tworzy tabelę DynamoDB, wywołując jej tablicę createAPI. Tabela DynamoDB zajmuje trochę czasu, aby zostać aktywnym, aby metoda wywoływała jego interfejs DescribeTable API w celu odpytywania o status w regularnych odstępach czasu do pewnego czasu (powiedzmy 5 minut - dopuszczalne odchylenie z powodu planowania wątków jest dopuszczalne). Zwraca wartość true, jeśli tabela stanie się aktywna w ciągu 5 minut, w przeciwnym razie zgłasza wyjątek.
Oto pseudokod:
public void createDynamoDBTable(String name) {
//call create table API to initiate table creation
//wait for table to become active
long endTime = System.currentTimeMillis() + MAX_WAIT_TIME_FOR_TABLE_CREATE;
while(System.currentTimeMillis() < endTime) {
boolean status = //call DescribeTable API to get status;
if(status) {
//status is now true, return
return
} else {
try {
Thread.sleep(10*1000);
} catch(InterruptedException e) {
}
}
}
throw new RuntimeException("Table still not created");
}
Rozumiem, że za pomocą Thread.sleep
blokuje bieżącego wątku, dzięki czemu zużywa zasobów. ale w dość średniej wielkości aplikacji jeden wątek jest poważnym problemem?
Czytam gdzieś, że używają ScheduledThreadPoolExecutor
i wykonuję tam odpytywanie o statusie. Ale znowu, musielibyśmy zainicjować tę pulę z co najmniej jednym wątkiem, w którym uruchomiłaby się możliwa do uruchomienia metoda odpytywania.
Wszelkie sugestie, dlaczego użycie Thread.sleep
jest tak złym pomysłem i jakie są alternatywne opcje osiągnięcia tego samego, co powyżej.
http://msmvps.com/blogs/peterritchie/archive/2007/04/26/thread-sleep-is-a-sign-of-a-poorly-designed-program.aspx – stinepike
Twój link jest o .Net. Nie dotyczy Java. –
Sondowanie jest złe, bez wątpienia. Ale jeśli nie masz alternatywy, to jest najmniejsza rzecz, o którą powinieneś się troszczyć. –