Metodos nao executando

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???

OBRIGADO

Outro problema que notei foi que a ordem de execução também esta incorreta:

Teste Criado =>
Teste Criado =>
	 Pronto para trabalhar ... 

RESULTADO 1: Thread-0 0
RESULTADO 2: Thread-0 -2
RESULTADO 1: Thread-0 4
RESULTADO 2: Thread-0 0
RESULTADO 1: Thread-0 8
RESULTADO 2: Thread-0 2
RESULTADO 1: Thread-0 12
RESULTADO 2: Thread-0 4
RESULTADO 1: Thread-0 16
RESULTADO 2: Thread-0 6
RESULTADO 1: Thread-0 20
RESULTADO 2: Thread-0 8
RESULTADO 1: Thread-0 24
RESULTADO 2: Thread-0 10
RESULTADO 1: Thread-0 28
RESULTADO 2: Thread-0 12
RESULTADO 1: Thread-0 32
RESULTADO 2: Thread-0 14
RESULTADO 1: Thread-0 36
RESULTADO 2: Thread-0 16
	 Pronto para trabalhar ... 

RESULTADO 1: Thread-1 0
RESULTADO 2: Thread-1 -2
RESULTADO 1: Thread-1 8
RESULTADO 2: Thread-1 2
RESULTADO 1: Thread-1 16
RESULTADO 2: Thread-1 6
RESULTADO 1: Thread-1 24
RESULTADO 2: Thread-1 10
RESULTADO 1: Thread-1 32
RESULTADO 2: Thread-1 14
RESULTADO 1: Thread-1 40
RESULTADO 2: Thread-1 18
RESULTADO 1: Thread-1 48
RESULTADO 2: Thread-1 22
RESULTADO 1: Thread-1 56
RESULTADO 2: Thread-1 26
RESULTADO 1: Thread-1 64
RESULTADO 2: Thread-1 30
RESULTADO 1: Thread-1 72
RESULTADO 2: Thread-1 34

POR FAVOR allguem consegue me ajudar???

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.