
Я використовую visualVM для підключення багатопотокової програми Java, потік має 4 статуси, а саме працює, сплячий, чекає, монітор. Що означає цей статус моніторингу? Яка різниця між очікуванням та монітором?

Я використовую visualVM для підключення багатопотокової програми Java, потік має 4 статуси, а саме працює, сплячий, чекає, монітор. Що означає цей статус моніторингу? Яка різниця між очікуванням та монітором?
Відповіді:
Ці стани такі самі, як зазначено у Thread.Stateпереліку. "Чекати" означає, як сказано в документації:
Потік знаходиться в стані очікування через виклик одного з наступних методів:
- Object.wait без тайм-ауту
- Thread.join без тайм-ауту
- LockSupport.park
"Монітор" - це BLOCKEDстан, в якому потік чекає отримання блокування для об'єкта (оскільки він намагається ввести synchronizedблок або метод, тоді як інший потік вже містить відповідний замок).
sleepingі waitingпоказаним на скріншоті ?!
Це не статус "моніторингу" ... Це вказує на те, що нитка знаходиться у Thread.State.BLOCKEDстані. Я бачу, що є ще одна хороша відповідь, я просто вкажу вам на це посилання для більш глибокого пояснення
Монітор означатиме, що потік чекає, щоб досягти блокування об’єкта. Наприклад, коли в одному потоці запущений синхронізований метод, а інший намагається викликати його на тому самому об’єкті, він не зможе, поки не буде завершено перше виклик методу. Це пов’язано з тим, що перший потік має монітор або блокування на цьому об’єкті, тому другий повинен почекати, поки він звільниться.
З підручників Oracle Threading :
"Синхронізація будується навколо внутрішньої сутності, відомої як внутрішній замок або блокування монітора. (Специфікація API часто позначає цю сутність просто як" монітор ".) Внутрішні блокування відіграють певну роль в обох аспектах синхронізації: забезпечуючи ексклюзивний доступ до стан об'єкта та встановлення стосунків, що відбуваються раніше, що є важливими для видимості ".