Boa noite para todos.
Estou com um pequeno problema que não consigo resolver.
Criei uma classe que extende Thread e uma outra principal, na principal eu faço um laço para instanciar e startar tres objs threads. Na classe da thread, no método run, eu faço um laço para imprimir de 1 a 10, coloquei o contador como static para todos os objs enxergarem o mesmo contador, sincronizei o obj para o numero não se repitir na thread. Segue o código:
Classe Principal
public class Ex5Main {
public static void main(String[] args) {
for (int i = 0; i < 3; i++) {
Ex5MinhaThread t = new Ex5MinhaThread(i);
t.start();
}
System.out.println("---Fim das 3 Threads disparadas---");
}
}
Classe da Thread
public class Ex5MinhaThread extends Thread {
private static int i = 0;
private int numeroThread;
public Ex5MinhaThread(int numeroThread) {
this.numeroThread = numeroThread;
}
public void run() {
while (i < 10) {
synchronized (this.getClass()) {
i++;
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("Thread " + numeroThread + ": " + i);
}
}
}
}
Quando rodo o programa acontece algo bizarro, segue a saída:
—Fim das 3 Threads disparadas—
Thread 0: 1
Thread 2: 2
Thread 1: 3
Thread 1: 4
Thread 1: 5
Thread 1: 6
Thread 1: 7
Thread 1: 8
Thread 2: 9
Thread 2: 10
Thread 0: 11
Thread 1: 12
Era para parar no número 10 mas o programa ainda imprimiu 11 e 12, agora quando rodo debugando o problema não acontece:
—Fim das 3 Threads disparadas—
Thread 0: 1
Thread 2: 2
Thread 1: 3
Thread 2: 4
Thread 0: 5
Thread 1: 6
Thread 1: 7
Thread 1: 8
Thread 1: 9
Thread 1: 10
Alguem poderia me ajudar a resolver este problema? Por que não vai ate o 10?
Abs
Rafael
