фоновый поток в Swing - PullRequest
       8

фоновый поток в Swing

1 голос
/ 28 марта 2011

Я в растерянности, простое использование свингера. Я добавил несколько простых кодов в 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-объекта. Он используется interfaceUpdate-thread (или рабочим потоком приложения) и другим потоком, в котором он инициализирован. Результат: 1). fpsTask-объект инициализируется в одном потоке 2). fpsTask-object передает значения другому потоку.

Когда я делаю fpsTask из FPSCalculatorGhost final, он начинает работать.

1 Ответ

1 голос
/ 28 марта 2011

Итак, проблема в строке installer.setFPS(fPSCalculatorGhost.getFPS());. Что оно делает? Он вызывает метод getAvrFPS и содержит этот блок:

synchronized (this) {
   return avrfps;
}

Этот блок synchronized может быть введен только в том случае, если никакой другой поток в то же время не находится в каком-либо синхронизированном блоке или синхронизированном методе того же объекта. В размещенном вами фрагменте кода такого блока / метода нет, поэтому вам придется искать его самостоятельно.

Самое главное, убедиться, что другой поток, который удерживает блокировку, не ожидает какого-либо результата от этого рабочего потока.

Когда вы попадете в тупик, запустите jstack с идентификатором процесса вашего Java-процесса, чтобы получить трассировки стека всех запущенных потоков - это включает блокировки, которые они удерживают и ожидают. (jps дает вам все идентификаторы Java-процессов.)

...