1

私は途方に暮れています、スイングワーカーの簡単な使い方。doInBackground() に簡単なコードをいくつか追加しましたが、実行されず、例外も発生しません。デバッガを使用すると、彼は正常に動作しています。)) 誰かがこのようなものを持っているか、この間違いをキャッシュする方法を教えてください...申し訳ありませんが、コードは複雑です。もっと何かが必要か、コメントを教えてください。「installer.setFPS(fPSCalculatorGhost.getFPS());」文字列を削除すると、すべて問題ありません。

    java.awt.EventQueue.invokeLater(new Runnable() {

        public void run() {
            new MainWindow().setVisible(true);
        }
    });


public MainWindow() {
    initComponents();
}


private void initComponents() {
    InterfaceUpdateWorker interfaceUpdate = new InterfaceUpdateWorker(
            new InterfaceInfoInstallerImpl());
    interfaceUpdate.setCamera(gLEventListenerImpl.getCameraGhost());
    interfaceUpdate.setfPSCalculatorGhost(gLEventListenerImpl.getFPSCalculatorGhost());
    interfaceUpdate.execute();
}
@Override
protected Void doInBackground() throws InterruptedException {
    while(true) {
        installer.setFPS(fPSCalculatorGhost.getFPS());
        installer.setCameraXPosition(
                cameraGhost.getCameraXPosition());
        installer.setCameraYPosition(
                cameraGhost.getCameraYPosition());
        installer.setCameraZPosition(
                cameraGhost.getCameraZPosition());
        Thread.sleep(200);
    }
}
public final class FPSCalculatorGhost {

    private FPSCalculatorGhost() {
    }

    public float getFPS() {
        return fpsTask.getAvrfps();
    }
}

public float getAvrfps() {
    synchronized (this) {
    return avrfps;
    }
}

すべてが fpsTask-object を中心に展開します。これは、interfaceUpdate-thread (またはアプリケーション ワーカー スレッド) によって使用され、他のスレッドによって使用され、そこで初期化されます。結果: 1)。fpsTask-object は 1 つのスレッドで初期化されます 2)。fpsTask-object は別のスレッドに値を渡します。

FPSCalculatorGhost final から fpsTask を作成すると、動作し始めます。

4

1 に答える 1

1

したがって、問題はinstaller.setFPS(fPSCalculatorGhost.getFPS());線です。それは何をするためのものか?メソッドを呼び出し、getAvrFPSこれにはこのブロックが含まれています。

synchronized (this) {
   return avrfps;
}

このsynchronizedブロックに入ることができるのは、同じオブジェクトの同期ブロックまたは同期メソッドに同時に他のスレッドがない場合のみです。投稿したコード スニペットには、そのようなブロック/メソッドがないため、自分で検索する必要があります。

最も重要なことは、ロックを保持している他のスレッドが、このワーカー スレッドからの結果を待機していないことを確認することです。

jstackデッドロックが発生した場合は、Java プロセスのプロセス ID を使用して実行し、実行中のすべてのスレッドのスタック トレースを取得します。これには、スレッドが保持および待機しているロックが含まれます。(jpsすべての Java プロセス ID が表示されます。)

于 2011-03-28T01:16:46.723 に答える