Ola, bom dia a todos!!!BOm, este erro esta aparecendo em um metodo que executo usando uma Timer e uma TimerTask …é uma tentativa minha para fazer com que este metodo que estou usando , seja executado a cada 3 minutos…o metodo em si, é uma thread que recebe mensagens da telnet numa BlockingQueue , e esta parte do timer , esta implementada para executar a gravação no banco dados de tempos em tempos…
Ele começa a executar, mas no console , depois de executar por um tempo, aparece esta mensagem que coloquei no assunto…
Se alguem puder me ajudar, fico grata, pois creio que esteja errando no uso da thread junto com o timer…antes de usar o timer, funcionava…
public void run() {
Timer timer = null;
while(true){
try {
msg = this.msgAtivo.poll(50,TimeUnit.MILLISECONDS);
} catch (InterruptedException ex) {
ex.printStackTrace();
}
if(msg != null){
nego = msg.split("!");
String aux = nego[0];
negociacao = aux.split(":");
timer = new Timer();
TimerTask controle = new TimerTask() { // aki vc faz a espera de 3 mins??
public void run() {
if(negociacao.length > 2){
atualizaCotacaoTelnet();
}
}
};
timer.scheduleAtFixedRate(controle,TEMPO,TEMPO);
}
}
}
ao meu entender vc pode trocar essa parte
TimerTask controle = new TimerTask() { // aki vc faz a espera de 3 mins??
public void run() {
if(negociacao.length > 2){
atualizaCotacaoTelnet();
}
}
};
por:
try{
Thread.sleep(180000); // esse tempo eh em milisegundos
}catch(Exception e){
ex.printStackTrace();
}
o metodo sleep() eh feito para segurar a execução de um programa por um determinado tempo em milisegundos
Ivolgarini, na vdd, onde vc colocou a pergunta se era o lugar onde faço a espera de 3 minutos, é o metodo run da Timetask, onde queria colocar o que deve ser feito no intervalo de 3 e 3 minutos, é o metodo que coloco na timer.scheduleAtFixedRate…pelo menos, foi assim a forma que eu entendi para poder usar o agendador de tarefas da TimerTask…
oi, so mais uma coisa, o sleep() seguraria a execucao da thread por 3 minutos…colocando o sleep no lugar da timertask, ele apenas demora tres minutos pra executar o comando …eu preciso implementar uma forma de fazer com que este metodo execute a thread num determinado espaço de tempo…
Mais uma coisa! Naum entendi muito bem pq o sleep nao funcionaria mas blz!
Eu particularmente nao gosto de usar laço infinito, apesar q o java executa um laço infinito em 2 segundos auhuahaua.
no seu codigo eu faria o seguinte!
boolean tempo = false;
while (!tempo){
//realiza toda a execução do programa
try{
//faz mais coisas aki, ai de repende deu um erro (exception)
}catch(Exception e){
tempo = true;
//aki vc dah um jeito de avisa q deu um erro no seu programa, assim vc pode evita out of memory
}
}
entendeu?
mais uma coisa, declare as variaveis e/ou objetos dentro do while tb
entao, o sleep ai nessa posição que passei no codigo, faz com que a thread execute uma linha, dai a thread dorme, depois faz outra, enfim, eu preciso que toda a table que usa esta thread seja preenchida, dai todas as informações sao gravadas no banco…terminado isso, preciso que esta atualização pare por alguns minutos e depois retorne, assim enquanto o sistema estiver conectado…
Tentei passar o sleep para o objeto que starta esta thread, so funciona uma vez, depois nao reinicia…o erro de outofMemoryerror nao acontece mais pq nao estou mais usando a Timer nem a TimerTask…estou tentando dar sleep , mas nao esta voltando a executar a thread em seguida…
Vc vai ter q mudar, colocar seu while na classe que chama sua thread.
Mais ou menos assim:
while(true)
{
/*Vc nunca pode dar um start() duas vezes no mesmo objeto thread, deve reinstancia-la*/
sua_classe_thread objeto = new sua_classe_thread();
objeto.start();
Thread.sleep(180000); //faz esse while parar por 3 minutos
}
Ola…entao, tentei na sexta instanciar a minha classe thread dentro da classe que a chama, mas da um erro qdo dou o new MinhaClasse , diz cannot find symbol , contructor new MinhaClasse…nesta classe thread tem parametros que sao passados dentro do metodo construtor dela…
oi Lucas…na hora de instanciar a classe Thread, aparece o erro…
vou passar os codigos, o primeiro é no evento do botão que inicia chama a classe Thread e onde nao consegui instancia-la…(Uso o netbeans)
desta forma como esta, ele executa uma vez, e nao volta mais…como nao cosnegui instanciar a classe Thread, nao pude fazer o que vc disse pra colocar dentro de um while