Utilizando el temporizador para pausar la ejecución del programa [duplicado]

Esta pregunta ya tiene una respuesta aquí:

Repaint no funciona correctamente como se requiere 1 respuesta

Quiero pausar la ejecución de un programa Swing durante un período de tiempo específico. Naturalmente, lo primero que usé fue Thread.sleep (100) (ya que soy un novato). Luego supe que mi programa no es seguro para subprocesos, así que decidí usar Timer con algunas sugerencias de otros programadores. El problema es que no puedo obtener ninguna fuente de donde puedo aprender cómo retrasar el hilo, usando Timer. La mayoría de ellos usan Timer para retrasar la ejecución. Por favor ayudame a resolver este problema. He proporcionado un fragmento de código compilable a continuación.

import javax.swing.*;
import java.awt.*;

public class MatrixBoard_swing extends JFrame{

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            MatrixBoard_swing b = new MatrixBoard_swing();      
          }
       });
    }

    MatrixBoard_swing(){
        this.setSize(640, 480);
        this.setVisible(true);
        while(rad < 200){
            repaint();
            rad++;
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }
    }

    int rad = 10;

    public void paint(Graphics g){
        super.paint(g);
        g.drawOval(400-rad, 400-rad, rad, rad); 
    }

}

EDIT: Mi versión de prueba para una implementación de Timer (dígame si está mal):

import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

public class MatrixBoard_swing extends JFrame implements ActionListener{

    Timer timer;

    public static void main(String[] args){
        SwingUtilities.invokeLater(new Runnable() {
          public void run() {
            MatrixBoard_swing b = new MatrixBoard_swing();      
          }
       });
    }

    MatrixBoard_swing(){
        this.setSize(640, 480);
        this.setVisible(true);
        timer = new Timer(100, this);
        timer.start();
    }

    int rad = 10;

    public void paint(Graphics g){
        super.paint(g);
        g.drawOval(400-rad, 400-rad, rad, rad); 
    }

    @Override
    public void actionPerformed(ActionEvent arg0) {
        repaint();
        rad++;
        if(rad >= 200){
            timer.stop();
        }
    }

Respuestas a la pregunta(1)

Su respuesta a la pregunta