Я изучил тот вызов Объекта wait()
метод выпустит объектный монитор, если существующий.
Но у меня есть некоторые вопросы относительно вызова notify()
на этом объекте другим потоком:
(когда) поток ожидания проснется, если другой (3-е) поток будет владеть объектным монитором в это время?
будет поток ожидания просыпаться, если 3-й названный поток wait()
на этом объекте?
действительно ли возможно определить, ожидает ли поток уведомления конкретного объекта (Java 1.4/java 5)
Что происходит если wait()
будет призван finalize()
метод?
notify
разбудит один поток, ожидающий на мониторе. Пока монитор не станет бесхозным, ни один ожидающий поток не сможет работать; wait() должен быть вызван в синхронизированном блоке, поэтому для продолжения работы этого блока необходимо удерживать блокировку. notifyAll
, чтобы дать всем потокам шанс проснуться. Когда вы вызываете wait () из потока, этот поток прекращает выполнение и добавляется в набор ожидания объекта. Когда вы вызываете notify () из другого потока, пробуждается случайный поток из набора ожидания, если вы вызываете notifyAll (), все будет готово к выполнению.
Когда вы вызываете notify (), поток готов к запуску, но это не означает, что он будет выполнен немедленно, так что будьте осторожны.
Это случайным образом будит поток из набора ожидания.
Вы не знаете, какой из них проснется первым, он не подчиняется никакому приказу.
Thread.getState ()
Вы можете создать тупик.
Вот почему у вас есть методы notify()
и notifyAll()
. Первый будит один поток, ожидающий объект, второй будит все потоки. Ожидающий поток не проснется, если wait()
будет вызван в другом потоке.
Нет.
Можно только вызвать thread.holdsLock(obj)
, чтобы узнать, держит ли поток мониторную блокировку на конкретном объекте.
Не вызывайте wait()
в методе finalize.
2: Не обязательно. notify()
пробуждает один из ожидающих потоков. Это может быть первоначальный или третий.
3: С помощью thread.getState()
можно узнать, ожидает ли поток объект, но я не знаю, всегда ли можно узнать, какой именно это объект.