1

自分のアプレットで、それ自体を待機しているスレッドが原因であると思われる散発的なクラッシュを回避するのに苦労しています。奇妙なことに、これは google chrome でのみ発生するようです。

30 秒の読み取り:

  • Applet.methodA() は JSObject.javascriptMethod() を呼び出します
  • javascriptMethod() は Applet.methodB() 呼び出しを行います
  • Applet.methodB() は Applet.methodA() がそのロックを解除するのを待ちますが、ロックが解除されることはありません。

私が試したこと:

  • javascriptMethod で setTimeout を使用します。そこには運がありません。
  • JSObject.call() の代わりに JSObject.eval() を使用する

また 、スレッド ダンプを完全に誤解している可能性もあります。こちらは車検用。

私の理解:

  1. シーケンサ スレッドは、applet.notifyPosition を呼び出します。
  2. notifyPosition は JavaScript メソッドを呼び出します
  3. javascript メソッドが applet.pause を呼び出す
  4. applet.pause はシーケンサーをロックする必要がありますが、notifyposition. の呼び出しでビジーであるためロックできません。

    "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)
            - locked <0x099c50e8> (a com.sun.media.sound.RealTimeSequencer$PlayThread)
            at com.sun.media.sound.RealTimeSequencer.implStop(Unknown Source)
            at com.sun.media.sound.RealTimeSequencer.stop(Unknown Source)
            - locked <0x099c8ca8> (a com.sun.media.sound.RealTimeSequencer)
            at net.alphatab.midi.MidiPlayer.pause(Unknown Source)
            at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
            at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            at sun.plugin.javascript.JSInvoke.invoke(Unknown Source)
            at sun.reflect.GeneratedMethodAccessor3.invoke(Unknown Source)
            at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
            at java.lang.reflect.Method.invoke(Unknown Source)
            at sun.plugin.javascript.JSClassLoader.invoke(Unknown Source)
            at sun.plugin2.liveconnect.JavaClass$MethodInfo.invoke(Unknown Source)
            at sun.plugin2.liveconnect.JavaClass$MemberBundle.invoke(Unknown Source)
            at sun.plugin2.liveconnect.JavaClass.invoke0(Unknown Source)
            at sun.plugin2.liveconnect.JavaClass.invoke(Unknown Source)
            at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$DefaultInvocationDelegate.invoke(Unknown Source)
            at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo$3.run(Unknown Source)
            at java.security.AccessController.doPrivileged(Native Method)
            at sun.plugin2.main.client.LiveConnectSupport$PerAppletInfo.doObjectOp(Unknown Source)
            at sun.plugin2.main.client.LiveConnectSupport.doObjectOp(Unknown Source)
            at sun.plugin2.main.client.MessagePassingJSObject.waitForReply(Unknown Source)
            at sun.plugin2.main.client.MessagePassingJSObject.call(Unknown Source)
            at net.alphatab.midi.MidiPlayer.notifyPosition(Unknown Source)
            at net.alphatab.midi.MidiPlayer.access$200(Unknown Source)
            at net.alphatab.midi.MidiPlayer$1.controlChange(Unknown Source)
            at net.alphatab.midi.TickNotifierReceiver.send(Unknown Source)
            at com.sun.media.sound.AbstractMidiDevice$TransmitterList.sendMessage(Unknown Source)
            - locked <0x0982d8e8> (a java.util.ArrayList)
            at com.sun.media.sound.RealTimeSequencer$DataPump.dispatchMessage(Unknown Source)
            at com.sun.media.sound.RealTimeSequencer$DataPump.pump(Unknown Source)
            - locked <0x09a56ae8> (a com.sun.media.sound.RealTimeSequencer$DataPump)
            at com.sun.media.sound.RealTimeSequencer$PlayThread.run(Unknown Source)
            at java.lang.Thread.run(Unknown Source)
    
4

1 に答える 1

3

問題のように見える部分を次に示します。

"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()問題は、何らかの理由で誰も電話をかけないことです。何らかの同期エラーが発生した可能性があるため、通知は実際には待機前に行われました。または、他のスレッドが通知する前に他のロックを待機しています (これは実際のデッドロックです)。

于 2011-07-24T03:11:43.127 に答える