質問

スイングワーカーの簡単な使い方で、迷っています。 DoinBackground()に簡単なコードを追加しましたが、実行されません。例外は表示されません。デバッガを使うとき、彼はそれがそうでなければならないように働いています。)))) 誰かがこのようなものを持っているか、この間違いをキャッシュする方法を教えてください、または... すみません、コードは複雑です。あなたはもっと多くのものやコメントが必要ですか? "installer.setfps(fpscalculatorghost.getfps())を削除した場合。" string、すべてが大丈夫になります。

    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オブジェクトを中心に回転します。これはInterfaceUpdate-Thread(またはアプリケーションワーカースレッド)によって使用され、他のスレッドによって使用され、そこで初期化されます。 結果: 1)。fpstask-objectは1スレッドで初期化されます 2)。fpstask-objectは別のスレッドに値を与えます。

FPSCalculatureGhost FinalからFPStaskを作るとき、それは仕事を始めます。

役に立ちましたか?

解決

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

synchronized (this) {
   return avrfps;
}
.

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

最も重要なことに、このワーカースレッドの結果を保持している他のスレッドがあることを確認してください。

デッドロックに遭遇すると、JavaプロセスのPROCESS-IDを使用してjstackを実行して、すべてのスレッドのスタックトレースを実行します。(jpsはすべてのJavaプロセスIDを提供します。)

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top