2012-01-09 10 views
19

Zauważam, że NetBeans ostrzega mnie przed używaniem Thread.sleep() w pętli while w moim kodzie Java, więc zrobiłem kilka badań na ten temat. Wydaje się, że najważniejszą kwestią jest wydajność, podczas której twój warunek może stać się prawdziwy, podczas gdy licznik wciąż śpi, marnując zegar ścienny, czekając na kolejną iterację. Wszystko to ma sens.Thread.sleep() w pętli while

Moja aplikacja musi skontaktować się z systemem zdalnym i okresowo odpytywać o stan operacji, czekając na zakończenie operacji przed wysłaniem następnego żądania. W chwili obecnej kod logicznie to robi:

String state = get state via RPC call 
while (!state.equals("complete")) { 
    Thread.sleep(10000); // Wait 10 seconds 
    state = {update state via RPC call} 
} 

Zważywszy, że okoliczność jest sprawdzenie zdalnej operacji (co jest dość kosztowny proces, w który biegnie przez kilka sekund), jest to ważny stosowanie nici. sleep() w pętli while? Czy istnieje lepszy sposób na uporządkowanie tej logiki? Widziałem kilka przykładów, w których mógłbym używać klasy Timer, ale nie widzę korzyści, ponieważ nadal wydaje się, że sprowadza się do tej samej prostej logiki powyżej, ale z dużo większą złożonością.

Niedźwiedź pamiętając, że system zdalny w tym przypadku nie jest pod moją bezpośrednią kontrolą, ani nie jest napisany w Javie, więc zmiana tego celu na bardziej "współpracujący" w tym scenariuszu nie jest opcją. Moją jedyną opcją aktualizowania wartości aplikacji dla stanu jest utworzenie i wysłanie wiadomości XML, otrzymanie odpowiedzi, przeanalizowanie jej, a następnie wyodrębnienie potrzebnej części informacji.

Wszelkie sugestie lub komentarze będą mile widziane.

+0

myślę, że w tej sytuacji jest całkowicie w prawo (jeśli nie można dostać powiadomienie, gdy wywołanie RPC zakończeniu). Sposób obejścia ostrzeżenia polega na użyciu polecenia do wykonania podczas cyklu. – kenota

+2

Myślę, że koszt pollingu stanu wywołania RPC musi być dość wysoki, aby zapewnić sen o długości 10 sekund. Jedna sekunda byłaby bardziej rozsądna, albo sen, który czeka na dłuższy czas w zależności od liczby poprzednich operacji snu (z pewnym maksimum oczywiście). –

+1

Jak już wspomniałem, zdalna operacja trwa kilka sekund (przez co rozumiem gdziekolwiek od 3-5). Biorąc pod uwagę kilka skrajnych przypadków, należy zająć się tym, że 10 sekund jest za krótkie. –

Odpowiedz

12

O ile Twój zdalny system nie może wydać zdarzenia lub w inny sposób informuje Cię asynchronicznie, nie sądzę, aby powyższe było w ogóle nieuzasadnione. Musisz zrównoważyć swój czas sleep() w stosunku do czasu/obciążenia wywoływanego przez wywołanie RPC, ale myślę, że to jedyny problem i powyższe nie wydaje się być problemem.

4

Bez możliwości zmiany zdalnego zakończenia, aby zapewnić powiadomienie "push", że odbywa się to z długim procesem, jest to mniej więcej tak, jak będziesz mógł to zrobić. Dopóki czas Thread.sleep jest długi w porównaniu z kosztem odpytywania, powinieneś być w porządku.

0

Powinieneś (prawie) nigdy nie używać snu, ponieważ jest on bardzo nieefektywny i nie jest dobrą praktyką. Zawsze używaj blokad i zmiennych warunkowych, w których wątki sygnalizują się nawzajem. Zobacz Coding Standards for Programming with threads

Szablon Mike Dahlin jest:

public class Foo{ 
    private Lock lock; 
    private Condition c1; 
    private Condition c2; 

    public Foo() 
    { 
    lock = new SimpleLock(); 
    c1 = lock.newCondition(); 
    c2 = lock.newCondition(); 
    ... 
    } 

    public void doIt() 
    { 
    try{ 
     lock.lock(); 
     ... 
     while(...){ 
     c1.awaitUninterruptibly(); 
     } 
     ... 
     c2.signal(); 
    } 
    finally{ 
     lock.unlock(); 
    } 
    } 
} 
+3

Nie jestem do końca pewien, jak to ma pomóc. –

+0

Cóż, myślę, że pyta o to, jak uporządkować swoją logikę i mówię (jako ogólny komentarz), że wewnątrz pętli while powinien użyć zmiennej warunku, aby zasygnalizować proces, który oczekuje na zakończenie zamiast ciągłego używania sen. – Cemre

+2

Myślę, że to ignoruje praktyczny problem, który wymaga, aby RPC była badana w jakiś sposób, prawda? –