Swing решает проблемы синхронизации потоков при запуске на виртуальной машине - PullRequest
0 голосов
/ 16 января 2020

Я сталкиваюсь со странной проблемой при попытке запустить свинг-проект из Gradle из виртуальной машины (гипервизор - kvm).

Код работает нормально при каждой попытке хост-ОС, но зависает метод jframe.pack() чаще всего запускается изнутри гостя. Я предполагаю, что проблема заключается в синхронизации потоков.

Как и в большинстве приложений Swing, нереально c пытаться опубликовать код для показа здесь .... но я могу указать на это в GitHub

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

Я не очень хорошо знаком с нюансами потоков, которые здесь происходят, что может быть источником выдавать? Я не делаю ничего необычного в создании собственных тем и т. Д. c. Я просто настраиваю свой пользовательский интерфейс, как обычно, и позволяю Swing обрабатывать свои потоки.

Хост:

  • Поток CentOS 8
  • 8 ядро / 32g RAM
  • Java 8

Гость:

  • Ubuntu 19.10
  • выделено 8 ядер / 16g RAM
  • Java 8

Упрощенный обзор настройки приложения Swing:

class Runner(){
    private Gui gui;

    public runGui(){ //what is run to run the gui
        gui = new Gui();
    }
}

// partially setup with Intellij's form builder
class Gui(){
    private JFrame mainFrame;
    //many other member variables and functions


    public void Gui(){
        //general setup of GUI code. generation of elements, event binding, etc
        this.mainFrame = new JFrame();
        ...

        // pack and open
        this.mainFrame.pack();
        this.mainFrame.setVisible(true);
    }

    {
        //intellij autogenerated form builder. Standard setup code.
        $$$setupUI$$$();
    }
}


1 Ответ

1 голос
/ 16 января 2020

Я не очень знаком с нюансами происходящих здесь потоков, что может быть источником проблемы?

Да. Это, вероятно, источник ваших проблем. Время потоков в виртуальной машине, вероятно, будет отличаться от времени на настольном компьютере. Однако, если ваш код написан правильно, это не должно повлиять на это.

Без дополнительной информации (например, минимальный воспроизводимый пример ) лучшее, что мы можем сделать, - указать вам на некоторые ресурсы по многопоточности в целом и правильный способ выполнения многопоточности в приложениях Swing:


Характеристики оборудования вряд ли будут иметь отношение к проблеме. Конечно, они не влияют на то, что вам нужно сделать, чтобы написать правильный код.

...