La mejor manera de implementar el bucle del juego sin congelar el hilo de la interfaz de usuario

Estoy tratando de hacer un juego 2D simple en Java.

Hasta ahora tengo unJFrame, con una barra de menú y una clase que se extiendeJPanel y anula espaint método. Ahora, necesito poner en marcha un bucle de juego, donde actualizaré la posición de las imágenes, etc. Sin embargo, estoy atrapado en la mejor manera de lograr esto. ¿Debo usar subprocesos múltiples, porque seguramente, si pones un bucle infinito en el hilo principal, la UI (y, por lo tanto, mi barra de menú) se congelará?

Aquí está mi código hasta ahora:

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

¿Alguna sugerencia o consejo? ¿Dónde debo poner mi bucle? ¿En mi clase principal o en mi clase GameCanvas?

Respuestas a la pregunta(3)

Su respuesta a la pregunta