Beste Möglichkeit, eine Spieleschleife zu implementieren, ohne den UI-Thread einzufrieren

Ich versuche, ein einfaches 2D-Spiel in Java zu erstellen.

So weit ich habe einJFrame, mit einer Menüleiste und einer Klasse, die @ erweiteJPanel und überschreibt es istpaint Methode. Jetzt muss ich eine Spieleschleife starten, in der ich die Position von Bildern usw. aktualisiere. Ich bin jedoch nicht sicher, wie ich das am besten erreichen kann. Sollte ich Multithreading verwenden, weil die Benutzeroberfläche (und damit meine Menüleiste) einfrieren wird, wenn Sie dem Hauptthread eine Endlosschleife zuweisen?

Hier ist mein Code:

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

Irgendwelche Hinweise oder Tipps? Wo soll ich meine Schleife setzen? In meiner Hauptklasse oder meiner GameCanvas-Klasse?