Jaka jest różnica między wait()
a sleep()
w wątkach?
Czy rozumiem, że wait()
wątek -ing wciąż działa w trybie roboczym i używa cykli procesora, ale sleep()
-ing nie zużywa żadnych cykli procesora?
Dlaczego mamy jedno wait()
i drugiesleep()
: w jaki sposób ich wdrożenie różni się na niższym poziomie?
java
multithreading
sleep
java-threads
Maniak
źródło
źródło
Odpowiedzi:
A
wait
może zostać „obudzony” przez inny wątek wzywającynotify
monitor, na który czeka się, podczas gdysleep
nie. Równieżwait
(inotify
) musi się zdarzyć w blokusynchronized
obiektu monitora, podczassleep
gdy nie:W tym momencie aktualnie wykonywany wątek czeka i zwalnia monitor . Może zrobić inny wątek
(na tym samym
mon
obiekcie) i pierwszy wątek (zakładając, że jest to jedyny wątek oczekujący na monitorze) się obudzi.Możesz także zadzwonić,
notifyAll
jeśli więcej niż jeden wątek czeka na monitorze - to obudzi je wszystkie . Jednak tylko jeden wątek będzie w stanie chwycić monitor (pamiętaj, żewait
jest wsynchronized
bloku) i kontynuować - pozostałe zostaną zablokowane, dopóki nie uzyskają blokady monitora.Inną kwestią jest to, że zadzwonisz
wait
naObject
siebie (to znaczy czekać na monitorze obiekt za), natomiast zadzwonićsleep
naThread
.Jeszcze innym jest to, że można dostać fałszywych wybudzeń z
wait
(tj wątku czeka CV bez wyraźnego powodu). Powinieneś zawszewait
podczas przędzenia na jakimś stanie w sposób następujący:źródło
wait
/notify
są zazwyczaj używane do oczekiwania na wykonanie jakiegoś innego wątku lub do spełnienia określonego warunku.Jedną kluczową różnicą, o której jeszcze nie wspomniano, jest to, że podczas uśpienia Wątek nie zwalnia blokad, które trzyma, podczas oczekiwania zwalnia blokadę na
wait()
wywołanym obiekcie .źródło
sleep
zawiera blokady java , ale tak nie jest. Aby mieć porównanie uczciwą, chcielibyśmy porównaćsynchronized(OUTER_LOCK){ Thread.sleep(1000); }
zsynchronized(OUTER_LOCK){ synchronized(LOCK){LOCK.wait();} }
i widzimy, że obie instrukcje nie zwolnićOUTER_LOCK
. Jeśli jest jakaś różnica, możemy powiedzieć, żesleep
nie używa jawnie blokad java , ale pytanie dotyczy cytatu „jak ich implementacja różni się na niższym poziomie?”. zamknąć cudzysłów.wait()
jest powiązany z warunkiem najbardziej wewnętrznej blokady, z której jest wywoływany, w twoim przykładzie koduwait()
można go zwolnić,LOCK
a nie tylkoOUTER_LOCK
. Tak właśnie jest zaprojektowany monitor Java. Uczciwe porównanie byłobysynchronized(OUTER_LOCK){ synchronized(LOCK) { Thread.sleep(1000); } }
isynchronized(OUTER_LOCK){ synchronized(LOCK) { LOCK.wait(); } }
. W tym przypadkusleep()
będą trzymać oba zamki, podczas gdywait()
zostaną zwolnione,LOCK
ale nadal będą trzymaneOUTER_LOCK
Uznałem ten post za pomocny. Stawia różnicę pomiędzy
Thread.sleep()
,Thread.yield()
orazObject.wait()
w kategoriach ludzkich. Cytować:źródło
sleep(n)
to domyślnie mówi, że aktualnie uruchomiony wątek dobrowolnie zrzeka się monitora zamka, co nie jest prawdą . Cytat z javadoc Wątku : „Wątek nie traci własności żadnych monitorów”.sleep
że nie ma żadnych specjalnych zachowań dotyczących monitora niż jakiekolwiek inne wywołanie metody Java, to znaczy, że nie wchodzi w interakcje ani nie modyfikuje ich w żaden sposób. Jeśli powiesz coś na temat monitorów, powinieneś określić, żewait
oprócz tego, co powiedziano powyżej, tymczasowo zniesie blokadę obiektu, do którego się wzywa.wait(n)
do porównaniasleep(n)
. Nie ma sensu porównywanie za pomocą opcji no-arg.Jest tu wiele odpowiedzi, ale nie mogłem znaleźć wyróżnienia semantycznego, o którym mowa.
Nie chodzi o sam wątek; obie metody są wymagane, ponieważ obsługują bardzo różne przypadki użycia.
sleep()
wysyła Wątek w tryb uśpienia, tak jak wcześniej, po prostu pakuje kontekst i przestaje działać na określony czas. Aby obudzić go przed upływem czasu, musisz znać odniesienie do wątku. To nie jest typowa sytuacja w środowisku wielowątkowym. Jest to najczęściej używane do synchronizacji czasu (np. Obudzić się dokładnie w 3,5 sekundy) i / lub zakodowanej uczciwości (po prostu śpij przez chwilę i pozwól innym wątkom działać).wait()
, wręcz przeciwnie, jest mechanizmem synchronizacji wątku (lub wiadomości), który pozwala powiadomić Wątek, o którym nie masz zapisanego odniesienia (ani opieki). Możesz to traktować jako wzorzec publikowania-subskrybowania (wait
== subskrybuj inotify()
== publikuj). Zasadniczo za pomocą powiadomienia () wysyłasz wiadomość (która może nawet nie zostać odebrana i zwykle nie obchodzi Cię to).Podsumowując, zwykle używasz
sleep()
do synchronizacji czasu i synchronizacjiwait()
wielu wątków.Mogą być zaimplementowane w ten sam sposób w podstawowym systemie operacyjnym lub wcale (ponieważ poprzednie wersje Java nie miały prawdziwej wielowątkowości; prawdopodobnie niektóre małe maszyny wirtualne też tego nie robią). Nie zapominaj, że Java działa na maszynie wirtualnej, więc Twój kod zostanie przekształcony w coś innego, zgodnie z VM / OS / HW, na którym działa.
źródło
Tutaj mam wymienione kilka ważnych różnic
wait()
isleep()
metod.PS: Kliknij również na linki, aby zobaczyć kod biblioteki (działa wewnętrznie, po prostu pobaw się trochę dla lepszego zrozumienia).
czekać()
wait()
Metoda zwalnia blokadę.wait()
jest metodąObject
klasy.wait()
jest metodą niestatyczną -public final void wait() throws InterruptedException { //...}
wait()
należy powiadomić za pomocąnotify()
lubnotifyAll()
metod.wait()
Metoda musi zostać wywołana z pętli, aby poradzić sobie z fałszywym alarmem.wait()
Metoda musi być wywołana z kontekstu synchronizowanego (tj. zsynchronizowana metoda lub blok), w przeciwnym razie wyrzuciIllegalMonitorStateException
sen()
sleep()
Metoda nie zwalnia blokady.sleep()
jest metodąjava.lang.Thread
klasy.sleep()
jest metodą statyczną -public static void sleep(long millis, int nanos) throws InterruptedException { //... }
sleep()
zostanie zakończone.sleep()
lepiej nie dzwonić z pętli (tj. patrz kod poniżej ).sleep()
może być wywoływany z dowolnego miejsca. nie ma szczególnych wymagań.Ref: Różnica między oczekiwaniem a snem
Fragment kodu do wywołania metody oczekiwania i uśpienia
źródło
Thread.sleep()
służy do udostępniania czasu procesora innym wątkom. okres uśpienia może zostać zakończony przez przerwania (tj. przez JVM). Przeczytaj ten stackoverflow.com/questions/4264355/…notify()
lubnotifyAll()
sąObject
metodami klasowymi. stąd są dostępne będą obj wszystkich klas (tj. tutaj również zThread
klasą). zobacz kod grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/…Istnieją pewne kluczowe notatki różnicowe, które podsumowuję po pracy nad czekaniem i snem, najpierw spójrz na próbkę za pomocą wait () i sleep ():
Przykład 1 : użycie funkcji wait () i sleep ():
Niech klarowność zawiera kilka kluczowych uwag:
Proszę popraw mnie jeżeli się mylę.
źródło
Różnica między funkcją wait () a sleep ()
Podstawową różnicą jest to, że
wait()
pochodziObject
isleep()
jest statyczna metodaThread
.Główną różnicą jest to, że
wait()
zwalnia blokadę, podczas gdysleep()
nie zwalnia żadnej blokady podczas oczekiwania.wait()
jest używany do komunikacji między wątkami, podczas gdysleep()
ogólnie służy do wprowadzania pauzy przy wykonywaniu.wait()
należy wywołać od wewnątrz synchronizować, albo dostaniemyIllegalMonitorStateException
chwilęsleep()
można wywołać w dowolnym miejscu.wait()
, musisz zadzwonićnotify()
lubnotifyAll()
. Co dosleep(),
wątku zaczyna się po określonym przedziale czasu.Podobieństwa
źródło
To bardzo proste pytanie, ponieważ obie te metody mają zupełnie inne zastosowanie.
Główną różnicą jest oczekiwanie na zwolnienie blokady lub monitora, podczas gdy sen nie zwalnia żadnej blokady ani monitora podczas oczekiwania. Czekanie służy do komunikacji między wątkami, podczas gdy sen służy do wprowadzenia pauzy przy wykonywaniu.
To było tylko jasne i podstawowe wyjaśnienie, jeśli chcesz czegoś więcej, czytaj dalej.
W przypadku
wait()
metody wątek przechodzi w stan oczekiwania i nie wróci automatycznie, dopóki nie wywołamynotify()
metody (lubnotifyAll()
jeśli masz więcej niż jeden wątek w stanie oczekiwania i chcesz obudzić wszystkie te wątki). I trzeba zsynchronizować lub blokady obiektu lub blokada klasa Aby uzyskać dostęp dowait()
albonotify()
lubnotifyAll()
metod. I jeszcze jedno:wait()
metoda jest używana do komunikacji między wątkami, ponieważ jeśli wątek przejdzie w stan oczekiwania, potrzebny będzie inny wątek, aby go obudzić.Ale w takim przypadku
sleep()
jest to metoda używana do wstrzymania procesu przez kilka sekund lub żądany czas. Ponieważ nie musisz prowokować żadnej metodynotify()
aninotifyAll()
metody odzyskania tego wątku. Lub nie potrzebujesz żadnego innego wątku, aby go oddzwonić. Na przykład, jeśli chcesz, aby coś się wydarzyło po kilku sekundach, np. W grze po kolejce użytkownika, chcesz, aby użytkownik czekał na uruchomienie komputera, możesz wspomniećsleep()
metodzie.I jeszcze jedna ważna różnica, o którą często pytamy w wywiadach:
sleep()
należy doThread
klasy iwait()
należy doObject
klasy.To są wszystkie różnice między
sleep()
iwait()
.I istnieje podobieństwo między obiema metodami: obie są sprawdzane, więc musisz spróbować złapać lub rzucić, aby uzyskać dostęp do tych metod.
Mam nadzieję, że to Ci pomoże.
źródło
źródło: http://www.jguru.com/faq/view.jsp?EID=47127
źródło
Czekaj i śpij to dwie różne rzeczy:
sleep()
wątku przestaje działać na określony czas.wait()
wątku przestaje działać aż istota Przedmiotem czekał na zostaje zgłoszone, zasadniczo innych nici.źródło
sleep
, jeśli chcesz, aby zatrzymał się, dopóki niektóre dane wejściowe nie będą pochodzić od drugiego, którego używaszwait
/notify
.interrupt
ma na celu zasygnalizować wątkowi, że powinien przestać robić to, co robi i zakończyć. Jest obsługiwany przezsleep
,wait
ale także blokuje funkcje We / Wy (i można zaimplementować funkcje o takim samym zachowaniu, wywołując metodęThread.interrupted()
). Jeśli chodzi o wydajność, funkcje są zwykle zoptymalizowane pod kątem celu, w którym zostały zaprojektowane.sleep
jest metodąThread
,wait
jest metodąObject
, podobniewait/notify
jak technika synchronizacji danych udostępnionych w Javie (przy użyciu monitora ), alesleep
jest prostą metodą wątku, aby się zatrzymać.źródło
sleep () jest metodą używaną do zatrzymania procesu przez kilka sekund lub żądany czas, ale w przypadku metody wait () wątek przechodzi w stan oczekiwania i nie wróci automatycznie, dopóki nie wywołamy powiadomienia () lub replaceAll ().
Główną różnicą jest to, że wait () zwalnia blokadę lub monitora podczas snu () nie zwalnia żadnej blokady lub monitora podczas oczekiwania. Czekanie służy do komunikacji między wątkami, podczas gdy sen jest używany do wprowadzenia pauzy w trakcie wykonywania.
Thread.sleep () wysyła bieżący wątek do stanu „Not Runnable” przez pewien czas. Wątek utrzymuje zgromadzone monitory - tzn. Jeśli wątek jest obecnie w zsynchronizowanym bloku lub metodzie, żaden inny wątek nie może wejść do tego bloku lub metody. Jeśli inny wątek wywoła t.interrupt (), obudzi uśpiony wątek. Pamiętaj, że uśpienie jest metodą statyczną, co oznacza, że zawsze wpływa na bieżący wątek (ten, który wykonuje metodę uśpienia). Częstym błędem jest wywołanie t.sleep (), gdzie t jest innym wątkiem; nawet wtedy uśpiony zostanie bieżący wątek, a nie wątek t.
object.wait () wysyła bieżący wątek do stanu „Not Runnable”, jak sleep (), ale z niespodzianką. Czekanie jest wywoływane na obiekcie, a nie na wątku; nazywamy ten obiekt „obiektem blokady”. Przed wywołaniem funkcji lock.wait () bieżący wątek musi zsynchronizować się z obiektem blokady; wait () następnie zwalnia tę blokadę i dodaje wątek do „listy oczekujących” powiązanej z blokadą. Później inny wątek może zsynchronizować ten sam obiekt blokady i wywołać funkcję lock.notify (). To budzi oryginalny, oczekujący wątek. Zasadniczo czekanie () / powiadomienie () jest jak sleep () / interrupt (), tylko aktywny wątek nie potrzebuje bezpośredniego wskaźnika do uśpionego wątku, ale tylko do obiektu blokady współużytkowanej.
Pozwól kategoryzować wszystkie powyższe punkty:
Call on:
Synchronized:
Hold lock:
Wake-up condition:
Usage:
Ref: diff
sleep
iwait
źródło
Krótko mówiąc, czekaj to czekaj, dopóki inny wątek cię nie wywoła, podczas gdy sen to „nie wykonuj następnej instrukcji” przez określony czas.
Ponadto sleep jest metodą statyczną w klasie Thread i działa na wątku, podczas gdy wait () znajduje się w klasie Object i jest wywoływany na obiekcie.
Kolejny punkt, kiedy wywołujesz oczekiwanie na jakiś obiekt, zaangażowany wątek synchronizuje obiekt, a następnie czeka. :)
źródło
wait
isleep
metody są bardzo różne:sleep
nie ma możliwości „przebudzenia”,wait
ma sposób na „przebudzenie” podczas okresu oczekiwania przez inny wąteknotify
lubnotifyAll
.Pomyśl o tym, nazwy są mylące pod tym względem; jednak
sleep
to standardowa nazwa iwait
jest jakWaitForSingleObject
alboWaitForMultipleObjects
w Win API.źródło
Z tego postu: http://javaconceptoftheday.com/difference-between-wait-and-sleep-methods-in-java/
Metoda wait ().
1) Wątek, który wywołuje metodę wait (), zwalnia blokadę.
2) Wątek odzyskuje blokadę po tym, jak inne wątki wywołują metody powiadomienia () lub notyfikuj wszystkie () na tej samej blokadzie.
3) W ramach synchronizowanego bloku należy wywołać metodę wait ().
4) Metoda wait () jest zawsze wywoływana na obiektach.
5) Oczekiwane wątki mogą zostać obudzone przez inne wątki, wywołując metody notice () lub replaceAll ().
6) Aby wywołać metodę wait (), wątek musi mieć blokadę obiektu.
Metoda sleep ()
1) Wątek, który wywołuje metodę sleep (), nie zwalnia blokady, którą trzyma.
2) metodę sleep () można wywołać w obrębie synchronizowanego bloku lub poza nim.
3) Metoda sleep () jest zawsze wywoływana dla wątków.
4) Śpiące wątki nie mogą zostać obudzone przez inne wątki. Jeśli to zrobisz, wątek zgłosi wyjątek InterruptedException.
5) Aby wywołać metodę sleep (), wątek nie musi mieć blokady obiektu.
źródło
wait()
jest metodąObject
klasy.sleep()
jest metodąThread
klasy.sleep()
pozwala wątkowi przejść dosleep
stanu przez x milisekund.Gdy wątek przechodzi w stan uśpienia
it doesn’t release the lock
.wait()
pozwala nić zwolnić blokadę igoes to suspended state
.Wątek będzie aktywny, gdy zostanie wywołana metoda
notify()
lubnotifAll()
dla tego samego obiektu.źródło
Jedną z potencjalnych dużych różnic między trybem uśpienia / przerwania a oczekiwaniem / powiadomieniem jest to
interrupt()
podczassleep()
zawsze powoduje wyjątek (np. InterruptedException ), podczas gdynotify()
podczaswait()
nie.Generowanie wyjątku, gdy nie jest potrzebne, jest nieefektywne. Jeśli masz wątki komunikujące się ze sobą z dużą prędkością, generowanie wielu wyjątków powodowałoby ciągłe wywoływanie przerwania, co jest całkowitym marnotrawstwem procesora.
źródło
Masz rację - Sleep () powoduje, że wątek przechodzi w stan „uśpienia”, a procesor wyłącza się i przetwarza inne wątki (inaczej zwane przełączaniem kontekstu), jak sądzę, Wait utrzymuje procesor przetwarzający bieżący wątek.
Mamy oba, ponieważ chociaż może wydawać się rozsądne, aby pozwolić innym osobom korzystać z procesora, gdy go nie używasz, w rzeczywistości istnieje przełączanie kontekstu narzutu - w zależności od tego, jak długo trwa sen, może być droższy w cyklach procesora do przełączania wątków, niż po prostu, aby twój wątek nic nie robił przez kilka ms.
Zauważ też, że sen wymusza zmianę kontekstu.
Ponadto - generalnie nie jest możliwe sterowanie przełączaniem kontekstu - podczas oczekiwania system operacyjny może (i będzie dłużej oczekiwał) wybrać przetwarzanie innych wątków.
źródło
interrupt
. Czas zakończenia jestn
zawait(n)
. Minęło już 8 lat i wciąż nikt nie zna odpowiedzi!Metody są używane do różnych rzeczy.
Thread.sleep (n) można przerwać, ale Object.wait () musi zostać powiadomiony. Możliwe jest określenie maksymalnego czasu oczekiwania:
Object.wait(5000)
więc można by użyćwait
, er,sleep
ale wtedy trzeba zawracać sobie głowę blokadami.Żadna z metod nie używa procesora podczas snu / oczekiwania.
Metody są implementowane przy użyciu kodu natywnego, przy użyciu podobnych konstrukcji, ale nie w ten sam sposób.
Szukaj sam: czy dostępny jest kod źródłowy metod natywnych? Plik
/src/share/vm/prims/jvm.cpp
jest punktem początkowym ...źródło
Thread.sleep(big_num)
musi zostać przerwane.Object.wait(small_num)
może zostać powiadomiony.Tutaj wait () będzie w stanie oczekiwania, dopóki nie powiadomi o tym inny wątek, ale gdzie jako sleep () będzie miał trochę czasu .. po tym, gdy automatycznie przejdzie w stan gotowości ...
źródło
Różnice oczekiwania () i snu ()?
Thread.sleep () Po zakończeniu pracy tylko zwolnij zamek dla wszystkich. dopóki nie zwolni nikogo z blokady.
Object.wait () Gdy przejdzie do etapu oczekiwania, zwolni klucz i będzie czekał przez kilka sekund na podstawie parametru.
Na przykład:
bierzesz kawę w prawą rękę, możesz wziąć inną osobę z tej samej ręki, kiedy odłożysz, zabierz tylko inny przedmiot tego samego typu. również. to jest sen () śpisz czas nie pracowałeś, robisz tylko spanie ... to samo tutaj również.
czekać(). kiedy jesteś przygnębiony i bierzesz inny środek, gdy czekasz, to czekaj
grasz film lub cokolwiek w swoim systemie tak samo jak odtwarzacz, nie możesz odtwarzać więcej niż jednego naraz, to jest tutaj, kiedy zamykasz i wybierasz inny dowolny film lub utwór, podczas gdy nazywa się czekać
źródło
wait
zwalnia blokadę isleep
nie. Wątek w stanie oczekiwania może się obudzić natychmiast po wywołaniunotify
lubnotifyAll
. Ale w przypadkusleep
nici utrzymuje blokadę i będzie kwalifikować się dopiero po upływie czasu snu.źródło
InterruptedException
zostaje wyrzucony, tak jak napisano w Javadoc.sleep()
Metoda powoduje przejście bieżącego wątku ze stanu roboczego do stanu zablokowania na określony czas. Jeśli bieżący wątek ma blokadę dowolnego obiektu, wówczas go trzyma, co oznacza, że inne wątki nie mogą wykonać żadnej zsynchronizowanej metody w tym obiekcie klasy.wait()
Metoda powoduje, że bieżący wątek przechodzi w stan bloku albo na określony czas, albo do powiadomienia, ale w tym przypadku wątek zwalnia blokadę obiektu (co oznacza, że inne wątki mogą wykonywać dowolne zsynchronizowane metody obiektu wywołującego.źródło
Moim zdaniem główna różnica między obydwoma mechanizmami polega na tym, że tryb uśpienia / przerwania jest najbardziej podstawowym sposobem obsługi wątków, podczas gdy oczekiwanie / powiadomienie to abstrakcja mająca na celu ułatwienie komunikacji między wątkami. Oznacza to, że sen / przerwanie może zrobić wszystko, ale trudniejsze jest wykonanie tego konkretnego zadania.
Dlaczego oczekiwanie / powiadomienie jest bardziej odpowiednie? Oto kilka osobistych uwag:
Wymusza centralizację. Pozwala na koordynację komunikacji między grupą wątków za pomocą pojedynczego obiektu wspólnego. To bardzo upraszcza pracę.
Wymusza synchronizację. Ponieważ zmusza programistę do zawinięcia połączenia w celu oczekiwania / powiadomienia w zsynchronizowanym bloku.
Jest niezależny od pochodzenia i numeru wątku. Dzięki takiemu podejściu możesz dowolnie dodawać więcej wątków bez edytowania innych wątków lub śledzenia istniejących. Jeśli używałeś trybu uśpienia / przerwania, najpierw musisz zachować odniesienia do uśpionych wątków, a następnie przerwać je pojedynczo, ręcznie.
Przykładem z prawdziwego życia, który warto wyjaśnić, jest klasyczna restauracja i metoda, którą pracownicy używają do komunikowania się między nimi: kelnerzy pozostawiają życzenia klientów w centralnym miejscu (tablica korkowa, stół itp.), zadzwonić, a pracownicy z kuchni przychodzą, aby przyjąć takie prośby. Po przygotowaniu kursu personel kuchni ponownie dzwoni, aby kelnerzy byli świadomi i zabrali go do klientów.
źródło
Przykład dotyczący snu nie zwalnia blokady, a czeka
Oto dwie klasy:
Singleton : Jest to klasa singleton z dwiema statycznymi metodami getInstance () i getInstance (boolean isWait).
i
Teraz uruchom ten przykład, uzyskasz wynik poniżej:
W tym przypadku wystąpienia Singleton utworzone przez wątek A i wątek B są takie same. Oznacza to, że wątek B czeka na zewnątrz, aż wątek A zwolni blokadę.
Teraz zmień Singleton.java, komentując Thread.sleep (500); metoda i odkomentowanie Singleton.class.wait (500); . Tutaj z powodu Singleton.class.wait (500); metoda threadA zwolni wszystkie blokady i przejdzie w stan „Non Runnable”, wątek B dostanie zmianę do wprowadzenia w bloku synchronicznym.
Teraz uruchom ponownie:
W tym przypadku instancje Singleton utworzone przez wątek A i wątek NIE są takie same, ponieważ wątek B otrzymał zmianę, aby wejść do bloku synchronicznego i po 500 milisekundach wątek A zaczął od swojej ostatniej pozycji i utworzył jeszcze jeden obiekt Singleton.
źródło
Powinny być wywoływane z bloku zsynchronizowanego:
wait()
metoda jest zawsze wywoływana z bloku zsynchronizowanego, tzn.wait()
Metoda musi zablokować monitor obiektu przed obiektem, na którym jest wywoływana. Alesleep()
metodę można wywołać z zewnętrznego synchronizowanego bloku, tzn.sleep()
Metoda nie wymaga monitorowania obiektu.IllegalMonitorStateException: jeśli
wait()
metoda jest wywoływana bez uzyskiwania blokady obiektu, niżIllegalMonitorStateException
jest generowana w czasie wykonywania, alesleep()
metoda nigdy nie zgłasza takiego wyjątku.Należy do której klasy:
wait()
metoda należy dojava.lang.Object
klasy, alesleep()
metoda należy dojava.lang.Thread
klasy.Wywoływany na obiekcie lub wątku:
wait()
metoda jest wywoływana na obiektach, alesleep()
metoda jest wywoływana na wątkach, a nie obiektach.Stan wątku: gdy
wait()
metoda jest wywoływana na obiekcie, wątek, który trzymał monitor obiektu przechodzi od stanu uruchomionego do stanu oczekiwania i może powrócić do stanu wykonalnego tylko wtedy, gdynotify()
lub obiektnotifyAll()
zostanie wywołany na tym obiekcie. Później harmonogram wątków planuje przejście tego wątku ze stanu uruchomionego do uruchomionego. kiedysleep()
nazywa się na wątku przechodzi od stanu wykonywania do czekania i może powrócić do stanu runnable gdy czas snu jest gotowy.W przypadku wywołania z bloku synchronicznego: w przypadku
wait()
wywołania metody wątek opuszcza blokadę obiektu. Alesleep()
metoda wywołana z synchronizowanego bloku lub wątku metody nie pozostawia blokady obiektu.Aby uzyskać więcej Referencje
źródło
Ze strony dokumentacji Oracle w metodzie wait ()
Object
:notify()
metodę lubnotifyAll()
metodę dla tego obiektu. Innymi słowy, ta metoda zachowuje się dokładnie tak, jakby po prostu wykonała wywołaniewait(0)
.Ta metoda rzuca
IllegalMonitorStateException
- jeśli bieżący wątek nie jest właścicielem monitora obiektu.InterruptedException
- jeśli jakikolwiek wątek przerwał bieżący wątek przed lub w trakcie, gdy bieżący wątek czekał na powiadomienie. Status przerwania bieżącego wątku jest usuwany po zgłoszeniu tego wyjątku.Ze strony dokumentacji Oracle w metodzie sleep ()
Thread
klasy:Ta metoda rzuca:
IllegalArgumentException
- jeżeli wartość millis jest ujemnaInterruptedException
- jeśli jakikolwiek wątek przerwał bieżący wątek. Status przerwania bieżącego wątku jest usuwany po zgłoszeniu tego wyjątku.Inna kluczowa różnica:
wait()
jest metodą niestatyczną (metoda instancji) w przeciwieństwie do metody statycznejsleep()
(metoda klasy).źródło
wait()
jest umieszczona pomiędzy zsynchronizowany sposób, podczas gdysleep()
podaje się wewnątrz nie zsynchronizowany sposób, ponieważwait()
sposób zwolnić blokadę obiektu, alesleep()
iyield()
zwalnialock()
.źródło
sleep()
może znajdować się wsynchronized
bloku lub metodzie. Odpowiedź nic nie wyjaśnia.wait(1000)
powoduje uśpienie bieżącego wątku do jednej sekundy .notify()
lubnotifyAll()
metody.sleep(1000)
powoduje uśpienie bieżącego wątku na dokładnie 1 sekundę .źródło
sleep(1000)
nie gwarantuje snu przez dokładnie 1 sekundę. Może to być wcześniej przerwane.W rzeczywistości wszystko to jest jasno opisane w dokumentach Java (ale zrozumiałem to dopiero po przeczytaniu odpowiedzi).
http://docs.oracle.com/javase/8/docs/api/index.html :
wait () - bieżący wątek musi posiadać monitor tego obiektu. Wątek zwalnia prawo własności do tego monitora i czeka, aż inny wątek powiadomi wątki oczekujące na monitorze tego obiektu, aby się obudził albo przez wywołanie metody notyfikacji, albo metody notyfikowania wszystkich. Wątek czeka następnie, aż będzie mógł odzyskać własność monitora i wznowi wykonywanie.
sleep () - Powoduje uśpienie aktualnie wykonywanego wątku (czasowo wstrzymaj wykonywanie) na określoną liczbę milisekund, z zastrzeżeniem precyzji i dokładności systemowych liczników czasu i harmonogramów. Wątek nie traci własności żadnych monitorów.
źródło