Pergunta

Estou perdido, um simples uso de swing trabalhador.Adicionei alguns códigos simples em doInBackground(), mas ele não executa, não recebo exceções.Quando uso o depurador, ele está funcionando como deveria.)) Pode ser alguém tem algo assim, ou fazer me dizer idéias como cache esse erro, ou ...Desculpe, o código é complexo.Diga-me se você precisa de algo mais ou comentários.se eu remover "installer.setFPS(fPSCalculatorGhost.getFPS());"-string, tudo ficará bem.

    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;
    }
}

Tudo gira em torno do objeto fpsTask.Ele é usado pelo interfaceUpdate-thread (ou thread de trabalho do aplicativo) e é usado por outro thread, onde é inicializado.Resultado:1).O objeto FPSTask é inicializado em um thread 2).fpsTask-object fornece valores para outro thread.

Quando faço o fpsTask do FPSCalculatorGhost final, ele começa a funcionar.

Foi útil?

Solução

Então, o problema é o installer.setFPS(fPSCalculatorGhost.getFPS()); linha.O que isso faz?Ele chama o getAvrFPS método, e este contém este bloco:

synchronized (this) {
   return avrfps;
}

Esse synchronized O bloco só pode ser inserido quando nenhum outro thread ao mesmo tempo estiver em algum bloco sincronizado ou método sincronizado do mesmo objeto.No trecho de código que você postou não existe tal bloco/método, então você mesmo deve pesquisá-lo.

Mais importante ainda, certifique-se de que o outro thread que mantém o bloqueio não esteja aguardando algum resultado deste thread de trabalho.

Quando você se deparar com o impasse, execute jstack com o ID do processo do seu processo java para obter rastreamentos de pilha de todos os threads em execução - isso inclui os bloqueios que eles estão mantendo e aguardando.(jps fornece todos os IDs de processos Java.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top