Ajuda com Thread!

Boa Tarde Galera do Guj 8)

estou tendo problemas em fazer funcionar Thread

criei uma classe extendida da Thread
e inseri o metodo run()

public class Relogio extends Thread {
    GregorianCalendar calendar = new GregorianCalendar();
    private String dataI;
    private String horaI;
    
    public void run() {
        mostraHora();            
        try{
            sleep(1000);
        }catch (InterruptedException ex) {
            JOptionPane.showMessageDialog(null, "Relógio com Problemas!");
        }
        
    }

obs. mostraHora() é pra mostra a hora (bem obvio né kkkkkk)

     public void mostraHora(){
        
        try{	 
            SimpleDateFormat hrFormat = new SimpleDateFormat("HH:mm:ss");
            horaI = hrFormat.format(calendar.getTime());
        }
        catch(Exception e){
            JOptionPane.showMessageDialog(null, e.getMessage());
         }        
    }

e apartir do frame Controle e chamo a classe relógio para atualizar a hora de segundo em segundo.

public class Controle extends javax.swing.JFrame {
    
    public Controle() {
        initComponents();
        
        Relogio relog = new Relogio();
        relog.start();
        jTxtHora.setText(relog.getHoraI());        
    }
    (...)

mas não consigo entender :roll: porque nao consigo o resultado esperado que é aparecer
a hora na JText atualizando de segundo em segundo.

Debuguei o projeto e percebi que o comando relog.start() não esta chamando o run() da classe relógio

alguém tem ideia do que possa estar ocorrendo!

desde já obrigado pela força :smiley:

Kra, tu tem q passar a instancia de textfield pro relogio e no relogio tem q ter akele codigo dentro de um while(true){ sleep(1000); /teu codigo/ }

o q tu ta fazendo atualmente eh setar o campo uma vez soh…

valeu a força mas não funciono kra :?

o Jtext estao recebendo os dados via GET no Frame

o pau está em não invocar o run() via .start()

Dá uma olhada aqui e na página 2 desse mesmo tópico.
http://www.guj.com.br/posts/list/52964.java#279083

Ao invés de criar uma thread, você pode usar só um timer do Swing, como demonstrado no terceiro exemplo.
É muito mais tranquilo, quando o assunto é Swing.

Vini valeu cara, realmente foi mais tranquilo utilizando o Timer!

mas em termos funcionais qual é mais eficiente:
o TIMER = mais tranquilo
ou o THREAD = mais casca de fazer!

mais uma vez obrigado

Para coisas desse tipo, acho que a diferença entre eles é desprezível. A única vantagem dos timers do Swing é que eles compartilham a mesma thread, e isso poupa recursos. Como a tendência é colocar a thread para dormir nos intervalos do timer, então não tem porque você ter algo muito poderoso, ou muitas threads. Afinal, ela vai passar a maior parte do tempo ociosa mesmo…

A própria arquitetura do Swing exige que os eventos sejam enfileirados e processados na queue da AWT, então, se você tiver threads muito rápidas, ou várias threads, a única coisa que vai acontecer é elas ficarem aguardando o Swing por mais tempo. Quando vários eventos de repaint ocorrem ao mesmo tempo, o Swing também os descarta, e processa apenas o último da pilha (não tem porque repintar mais rápido do que o olho é capaz de ver).

Agora, controlar um socket, esperar por IO ou pelo BD, ou fazer um processamento contínuo e ininterrupto - como calculos matemáticos - são assuntos para as Threads mesmo. Você pode ganhar muito, especialmente em arquiteturas com múltiplos núcleos, onde as threads são colocadas em paralelo.

Via de regra, opte pelo mais simples, especialmente quando o assunto é threads (onde na hora de controlar no braço nada é tão simples assim). Se a performance pegar, use um profiler, pois as há mais chances do problema ser no seu código do que nos mecanismos fornecidos pela Sun em si.

Se depois de otimizar seu código, você ainda detectar problemas no mecanismo, aí sim, é uma boa hora de pensar em alternativas para ele. E geralmente a própria Sun fornece boas alternativas (várias delas no pacote java.util.concurrent).