Resultado inesperado com Threads

5 respostas
F

Criei um código e obtive um resultado que eu não soube explicar o motivo, segue o código:

private volatile static int contador = 0;
     
   public static void main( String[] args ) {
      for( int i = 0; i < 10000; i++ ) {
         Thread thread = new Thread() {
            public void run() {
               contador++;
               System.out.println( contador );
            } 
         };
         thread.start();
      }
   }

Sei que não é garantida a impressão sequencial e crescente dos valores, ou seja, alguns números podem se repetir e eles serão impressos em uma ordem aleatória.
O que me deixou confuso foi o fato de que o número 10000 não foi impresso.
Alguém sabe me dizer o motivo?
Utilizei o java 6 64bits na execução do teste.

5 Respostas

E

Explique por que é que o número 10000 é impresso no código abaixo.

package guj;

public class Exemplo10000Threads {
    private volatile static int contador = 0;

    public static void main(String[] args) throws InterruptedException {
        Thread[] threads = new Thread[10000];
        for (int i = 0; i < 10000; i++) {
            threads[i] = new Thread() {
                public void run() {
                    contador++;
                    System.out.println(contador);
                }
            };
            threads[i].start();
        }
        for (int i = 0; i < 10000; ++i) {
            threads[i].join();
        }
    }
}
F

Entendi onde vc quer chegar com relação a utilização do join na Thread main.
Acredite.
Executando o meu código e o seu, obtive o mesmo resultado, 10000 linhas foram impressas, porém em nenhuma delas saiu o número 10000.

E

Estranho. Eu rodei o meu programa e o número 10000 não apareceu na última linha, mas sim umas 400 ou 500 linhas antes do final. (Cada vez que se roda o programa dá um resultado diferente). Quanto ao seu programa, não contei as linhas.

esmiralha

contador = 0

thread 1 starta
thread 2 starta
thread 1 incrementa contador
thread 2 incrementa contador
thread imprime 2
thread imprime 2

onde está o 1? está junto com o 10000 na casa do demônio Concurrius

E

Uh, agora entendi.

contador++;  
                     System.out.println(contador);

O que ocorre se chavear entre uma thread e outra, entre as linhas 1 e 2?

Criado 1 de dezembro de 2010
Ultima resposta 2 de dez. de 2010
Respostas 5
Participantes 3