Лучший способ реализовать игровой цикл без замораживания потока пользовательского интерфейса

Я пытаюсь сделать простую 2D-игру на Java.

Пока у меня естьJFrame, с menubar, и класс, который расширяетсяJPanel и переопределяет этоpaint метод. Теперь мне нужно запустить игровой цикл, где я буду обновлять положение изображений и так далее. Тем не менее, я застрял на том, как лучше всего добиться этого. Должен ли я использовать многопоточность, потому что, конечно, если вы поместите бесконечный цикл в основной поток, пользовательский интерфейс (и, следовательно, моя строка меню) зависнет?

Вот мой код до сих пор:

import java.awt.Color;
import java.awt.Graphics;

import javax.swing.JPanel;

@SuppressWarnings("serial")
public class GameCanvas extends JPanel {

    public void paint(Graphics g) {
        while (true) {
            g.setColor(Color.DARK_GRAY);
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }
}

import javax.swing.JFrame;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;

@SuppressWarnings("serial")
public class Main extends JFrame {

    GameCanvas canvas = new GameCanvas();
    final int FRAME_HEIGHT = 400;
    final int FRAME_WIDTH = 400;

    public static void main(String args[]) {
        new Main();
    }

    public Main() {
        super("Game");

        JMenuBar menuBar = new JMenuBar();
        JMenu fileMenu = new JMenu("File");
        JMenuItem startMenuItem = new JMenuItem("Pause");
        menuBar.add(fileMenu);
        fileMenu.add(startMenuItem);

        super.add(canvas);
        super.setVisible(true);
        super.setSize(FRAME_WIDTH, FRAME_WIDTH);
        super.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        super.setJMenuBar(menuBar);
    }
}

Любые указатели или советы? Где я должен поставить свою петлю? В моем основном классе или в классе GameCanvas?

Ответы на вопрос(3)

Ваш ответ на вопрос