Olá, estou com dois metodos em uma thread que nao estao sendo executados corretamente. Tenho a seguinte situação:
package core;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
public class Teste extends Thread {
static Teste w;
BlockingQueue<Integer> listaTarefa;
public Teste() {
System.out.println("Teste Criado =>");
this.listaTarefa = new LinkedBlockingQueue<Integer>();
this.start();
}
public void run() {
System.out.println("\t Pronto para trabalhar ... \n");
while (true) {
try {
int tarefa = listaTarefa.take();
int result1 = calcNew(tarefa);
int result2 = calcOld(tarefa);
System.out.println("RESULTADO 1: " + Thread.currentThread().getName() + " " + result1);
System.out.println("RESULTADO 2: " + Thread.currentThread().getName() + " " + result2);
} catch (Exception e) {
}
}
}
public int calcNew(int x) {
return x * 2;
}
public int calcOld(int x) {
return x - 2;
}
public void addList(int valor) {
try {
this.listaTarefa.put(valor);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
Quando instancio este objeto da seguinte e executo da seguinte forma:
package core;
public class ExecTeste {
/**
* @param args
*/
static Teste t1;
static Teste t2;
public static void main(String[] args) {
// TODO Auto-generated method stub
t1 = new Teste();
t2 = new Teste();
for (int i=0; i<10; i++) {
t1.addList(i*2);
t2.addList(i*4);
}
}
}
Geralmente os metodos das threads nao são executados. As vezes sim e as vezes somente os valores da t2 são informados. Muito estranhoo alguem consegue me auxiliar???
Bem cara, essa não é minha especialidade, mas percebo alguns detalhes no seu código que estão muito estranhos.
primeiro, o método addList devia ser syncronized, mas você simplesmente o declarou, o que abre espaço para erros. Imagine que durante a operação take, o a thread mude para o add?? onde vai ser jogada a exception?? todos os métods que acessa a sua pilha devem ser syncronized.
Segundo, não percebi realmente algum problema na sucessão no seu código. Lembre-se: é impossível definir qualquer tipo de ordem em programação concorrente. Se você precisa realmente definir uma ordem, então não deve usar programação concorrente, e sim só a convencional mesmo. Se quer ver alguma superposição de trheads nesse seu código, onde você colocou dez, devia estar 10 mill.
Terceiro, usar um bloco catch (Exception e) {} vazio é um dos piores erros que a maioria dos programadores fazem, pois além de tornar impossível saber se um erro ocorreu, torna impossível descobrir qual é o tipo de erro.
Deixa eu te perguntar uma coisa: imagine que a linha 22 da primeira classe seja executada antes da Thread principal sequer chegar no for (lembre-se que é impossível definir quando cada um ocorre). Depois que o método take() falha, por termos um deque vazio, o que garante que o objeto listaTarefa vai continuar funcionando?? O que garante que vai continuar sendo possível usar o add() e o take() depois??
Concorrência é um recurso complicado. Recomendo que você estude mais sobre o assunto antes de se aventurar por esse caminho. Estude mais sobre exceções também. Muita gente ignora, mas entende-las nos poupa muita dor de cabeça.