Монитор выполняет один поток за раз. Предполагая, что у вас есть потоки T1-T10, 9 являются BLOCKED
, а один - RUNNABLE
. Время от времени монитор выбирает новый поток для запуска. Когда это происходит, выбранный / текущий поток, скажем, T1, изменяется от RUNNABLE
до BLOCKED
. Затем другой поток, скажем, T2, переходит от BLOCKED
к RUNNABLE
, становясь текущим потоком.
Когда одному из потоков требуется предоставить информацию другим потоком, вы используете wait()
. В этом случае поток будет помечен как WAITING
, пока не будет notify()
ed. Таким образом, ожидающий поток не будет выполняться монитором до тех пор. Например, подождите, пока появятся ящики для выгрузки. Парень, загружающий коробки, уведомит меня, когда это произойдет.
Другими словами, BLOCKED
и WAITING
являются статусом неактивных потоков, но поток WAITING
не может быть RUNNABLE
без перехода к BLOCKED
в первую очередь. WAITING
потоки "не хотят" становиться активными, тогда как BLOCKED
потоки "хотят", но не могут, потому что это не их очередь.
Я думаю.