Monitor wykonuje jeden wątek na czas. Zakładając, że masz wątki T1-T10, 9 to BLOCKED
, a jeden to RUNNABLE
. Co jakiś czas monitor wybiera nowy wątek do uruchomienia. Kiedy tak się dzieje, wybrany/bieżący wątek, powiedzmy T1, przechodzi od RUNNABLE
do BLOCKED
. Kolejny wątek, na przykład T2, przechodzi z BLOCKED
do RUNNABLE
, stając się bieżącym wątkiem.
Gdy jeden z wątków potrzebuje informacji do udostępnienia przez inny wątek, należy użyć wait()
. W takim przypadku wątek zostanie oznaczony jako WAITING
, dopóki nie zostanie zmieniony na notify()
. Tak więc wątek, który czeka, nie zostanie wykonany przez monitor do tego czasu. Przykładem może być: poczekaj, aż zostaną rozładowane skrzynki. Pola ładujące faceta powiadomią mnie, kiedy to się stanie.
Innymi słowy, zarówno BLOCKED
i WAITING
są status nieaktywnych wątków, ale WAITING
wątek nie może być RUNNABLE
bez przechodzenia do BLOCKED
pierwszy. WAITING
wątki "nie chcę" stają się aktywne, podczas gdy BLOCKED
wątki "chcą", ale nie mogą, ponieważ nie jest ich kolej.
Myślę.
Uwaga boczna: Powiąż połączenie oczekujące z warunkiem. – zgulser