Fiz um relogio bem simples só num JLabel mesmo… Estou estudando Threads e queria dicas!
@Override
public void run() {
try {
Date data = new Date();
Calendar c = Calendar.getInstance();
c.setTime(data);
int hora = c.get(Calendar.HOUR_OF_DAY);
int min = c.get(Calendar.MINUTE);
int seg = c.get(Calendar.SECOND);
while (true) {
tempo.setText(hora + ":" + min + ":" + String.format("%1$02d", seg++));
Thread.sleep(1000);
if (seg == 60) {
seg = 0;
++min;
}
if (min == 60) {
min = 0;
++hora;
}
if (hora == 24) {
hora = 0;
}
}
} catch (InterruptedException e) {
}
}
O código está funcionando, só queria dicas de aperfeiçoamento! Vlws!
edit: na literatura que estou lendo diz que uma thread depois que sai de um Thread.sleep(long m) não necessariamente VAI ser movida para o estado de execução… Entao uma duvida também é: como fazer que com CERTEZA a thread desse relogio, a qual dei sleep, volte para o estado de execução ao inves de outras thread entrarem no caminho!?
No way. O correto, no seu caso, é você pegar o horário atual sempre, já que você nunca vai saber exatamente quanto tempo seu Thread.sleep gastou EXATAMENTE.
Se você pedir Thread.sleep (1000), por exemplo, pode ser que o Java espere 1 segundo e 15 milissegundos, por exemplo. Portanto, do jeito que você fez, o seu relógio vai acabar ficando atrasado gradativamente. É melhor atualizar seu relógio de 500 em 500 ms, por exemplo, e sempre pegar o horário atual.
E nunca use um “while true” para modificar um JLabel, ou seja lá o que for.
No seu caso em particular, use um javax.swing.Timer ou um java.util.Timer.
[code]private Timer timia = new Timer(1000, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
tempo.setText(df.format(new Date()));
}
});[/code]
Fazendo isso pode sobrecarregar a JVM? Criando muitos objetos date? Apesar de que eles podem ser GCed, isso não pode criar um uso de memoria em excesso?
Nunca usei o SimpleDateFormat, ele é muito melhor que o DateFormat? Eu acustumei a usar o DateFormat…
De fato, um Timer é implementado como uma thread, mas ela não é muito robusta. Se o método actionPerformed lançar alguma exceção, então o “timer para”. Você pode modificar o código que escrevi para
timer = new Timer (500, new ActionListener() {
private DateFormat df = new SimpleDateFormat ("HH:mm:ss");
public void actionPerformed(ActionEvent e) {
if (canUpdate) {
try {
String hhmmss;
hhmmss = df.format (new Date());
TesteRelogio.this.lblClock.setText (hhmmss);
} catch (Throwable ex) {
}
}
}
});