Olá a todos. Aqui, tenho um programa que monitora uma tabela de logs em uma base de dados Oracle. Tudo funcionando perfeitamente. O código da Thread que fica monitorando a base de dados pode ser visto abaixo:
//Thread que fica atualizando a tabela de tempos em tempos
Thread monitora = new Thread(new Runnable(){
@Override
public void run(){
try{
while(paraThreadMonitora){
proceduresErros.clear();
preencheTabela();
monitoraLinhasTabela();
SimpleDateFormat sdf = new SimpleDateFormat("HH:mm:ss");
Date d = new Date();
hora = sdf.format(d);
setTitle("Monitorando em tempo real...");
lblMonitorando.setForeground(Color.GREEN);
lblMonitorando.setText("Monitorando a cada " + tempoEntreBuscas + " segundos.");
lblHoraExecucao.setText("" + hora);
lblRegistrosBusca.setText("" + cadsinc.size());
lblUsuario.setText("" + usuario.toUpperCase());
Thread.sleep(tempoEntreBuscas * 1000); //Dorme por X segundos
contTotalExecucoesMonitoramento++;
}
}
catch(Exception e){
e.printStackTrace();
}
}
}, "monitora");
Essa Thread acima é chamada dentro do action de um botão, como pode ser visto abaixo:
try{
paraThreadMonitora = true;
paraThreadCronometro = true;
cronometro.start();
if(!monitora.isAlive()){
monitora.start();
}
}
catch(Exception e){
e.printStackTrace();
}
Também existe um botão para interromper esse monitoramento, cuja seu código segue abaixo:
Object[] opcoes = {"SIM", "NÃO"};
int escolha = JOptionPane.showOptionDialog(null, "Deseja interromper o monitoramento?", "Interromper monitoramento.", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, opcoes, opcoes[0]);
if(escolha == JOptionPane.YES_OPTION){
paraThreadMonitora = false;
paraThreadCronometro = false;
cronometro.interrupt();
lblCronometro.setText("");
lblMonitorando.setForeground(Color.RED);
lblMonitorando.setText("O monitoramento foi interrompido pelo usuário.");
this.setTitle("Monitoramento interrompído");
}
Quando eu interrompo o monitoramento, através do código acima, nenhuma exception ocorre, mas se eu tentar iniciar novamente esse monitoramento, o seguinte erro ocorre:
java.lang.IllegalThreadStateException
at java.lang.Thread.start(Thread.java:595)
at br.com.Visao.Principal.mnuBuscaHoraActionPerformed(Principal.java:537)
at br.com.Visao.Principal.access$1200(Principal.java:24)
at br.com.Visao.Principal$10.actionPerformed(Principal.java:440)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
at javax.swing.AbstractButton.doClick(AbstractButton.java:357)
at javax.swing.plaf.basic.BasicMenuItemUI.doClick(BasicMenuItemUI.java:1225)
at javax.swing.plaf.basic.BasicMenuItemUI$Handler.mouseReleased(BasicMenuItemUI.java:1266)
at java.awt.Component.processMouseEvent(Component.java:6134)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
at java.awt.Component.processEvent(Component.java:5899)
at java.awt.Container.processEvent(Container.java:2023)
at java.awt.Component.dispatchEventImpl(Component.java:4501)
at java.awt.Container.dispatchEventImpl(Container.java:2081)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4301)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3965)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3895)
at java.awt.Container.dispatchEventImpl(Container.java:2067)
at java.awt.Window.dispatchEventImpl(Window.java:2458)
at java.awt.Component.dispatchEvent(Component.java:4331)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Ou seja, para eu reiniciar o monitoramento, tenho que reiniciar o programa, pois se eu interromper a Thread e inicia-la de novo, gera o erro acima citado.
Onde eu estou errando?
Grato pela atenção.