Здесь мы видим часть, которая выглядит как проблема:
"Java Sound Sequencer" prio=8 tid=0x189de400 nid=0x86c in Object.wait() [0x1c6ae000]
java.lang.Thread.State: TIMED_WAITING (on object monitor)
at java.lang.Object.wait(Native Method)
- waiting on <0x099c50e0> (a java.lang.Object)
at com.sun.media.sound.RealTimeSequencer$PlayThread.stop(Unknown Source)
- locked <0x099c50e0> (a java.lang.Object)
Это ожидание <0x099c50e0>
не означает, что поток ожидает получения блокировки, но у него была блокировка, и вызвал wait()
для этого объекта, что означает, что он временно отдал блокировку и ждет, пока какой-нибудь другой поток вызовет .notify()
или .notifyAll()
для этого же объекта.
Таким образом, эта трассировка одного стека не показывает тупик.
Конечно, может случиться так, что реальные вызовы из апплета в JavaScript и из JavaScript обратно в апплет выполняются в разных потоках, что может показать поведение, которое вы описываете. Но трассировка стека, которая у вас есть, похоже, не указывает на это (я полагаю, что классы alphatab принадлежат вам).
Проблема в том, что по какой-то причине никто не звонит notify()
. Возможно, произошла какая-то ошибка синхронизации, поэтому уведомление пришло раньше ожидания. Или какой-то другой поток ожидает уведомления о какой-либо другой блокировке (это будет настоящая мертвая блокировка).