Ola Zabeu,
bom tirando suas duvidas, nos codigos que voce apresentou eu não vejo diferença. A unica diferença entre eles é que um voce instancia direto e o outro voce esta chamando um metodo estatico de uma classe, que provavelmente faz as instanciações dentro dele.
Voce instanciando
Clientes Cl = new Clientes
Cl.setvisible = true
Estatico
Clientes.main();
O segundo é o mais adequado por questão de responsabilidade da classe, ela é responsavel pelo seus atributos e facilita a manutenção do codigo. Mas não existe nenhuma diferença entre os dois com relação a utilizar threads, os dois utilizam threads ao criar o formulario. O que pode haver é diferença no momento de criar a thread que gerencia o formulario.
por uma questão de gerenciamento mais adequado das Threads que são carregadas na JVM sugiro que utilize o codigo abaixo para invocar o formulario. A classe javax.swing.SwingUtilities.invokeLater que é utilizada nele foi criada para evitar problemas com threads no swing. Se precisar de mais informações da uma olhada nessa pagina da sun tem varios toques interessantes sobre essa questão (http://java.sun.com/docs/books/tutorial/uiswing/), o codigo que estou colando aqui eu peguei de la.
import javax.swing.*;
public class HelloWorldSwing {
/**
* Create the GUI and show it. For thread safety,
* this method should be invoked from the
* event-dispatching thread.
*/
private static void createAndShowGUI() {
//Create and set up the window.
JFrame frame = new JFrame(“HelloWorldSwing”);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//Add the ubiquitous "Hello World" label.
JLabel label = new JLabel("Hello World");
frame.getContentPane().add(label);
//Display the window.
frame.pack();
frame.setVisible(true);
}
public static void main(String[] args) {
//Schedule a job for the event-dispatching thread:
//creating and showing this application's GUI.
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowGUI();
}
});
}
}
Espero ter ajudado
Paulo