No livro da Kathy (SCJP 5 Pt) tem um exercicio que pede pra criar uma classe que dispare 3 threads.
Essas threads tem que imprimir 100 vezes uma letra.
A saída final tem que ser:
100 vezes a letra A na mesma linha
100 vezes a letra B na mesma linha
100 vezes a letra C na mesma linha
.
Tentei o seguinte código e as vezes dá certo, as vezes não.
Alguém sabe porque ?
Dar um start() em uma thread significa que colocou ela em modo de executável, agora o modo de EXECUTANDO é diferente, quem controla isso é a JVM.
Portanto, dê um join() em todas as suas threads.
[]'s
Lavieri
publicclassBlaBlaBlaextendsThread{privatecharc;privateBlaBlaBlawaitFor;privatevoidwaitFor(){if(waitFor!=null){try{waitFor.join();}catch(InterruptedExceptione){thrownewRuntimeException(e);}}}publicvoidrun(){waitFor();for(inti=0;i<100;i++)System.out.print(c);System.out.println();}publicBlaBlaBla(charc){this(c,null);}publicBlaBlaBla(charc,BlaBlaBlawaitFor){this.c=c;this.waitFor=waitFor;}publicstaticvoidmain(String[]args){BlaBlaBlat1=newBlaBlaBla('A');BlaBlaBlat2=newBlaBlaBla('B',t1);BlaBlaBlat3=newBlaBlaBla('C',t2);t2.start();t1.start();//pode trocar a hordem a vontadet3.start();}}
outra forma, caso não queira passar pelo construtor é adcionar o método
public void setWaitFor(BlaBlaBla waitFor) {
this.waitFor = waitFor;
}
e depois mudar o main assim
publicstaticvoidmain(String[]args){BlaBlaBlat1=newBlaBlaBla('A');BlaBlaBlat2=newBlaBlaBla('B');BlaBlaBlat3=newBlaBlaBla('C');t3.setWaitFor(t2);t2.setWaitFor(t1);t2.start();t1.start();//pode trocar a hordem a vontadet3.start();}
Enfim existe muitas formas de solucionar o problema, mas o fato é que você precisa usar join para garantir a ordem que as coisas serão feitas
Isso que vc colocou funciona, masss não é abordagem correta…
o fato é q vc esta startando t1, e ta dando um JOIN através da thread main, e a thread main fica esperando ate t1 acabar, e so ai strata a thread2 …
e assim por diante…
…
as threads acabam sem ser startada simultaneamente, o join, deveria ser feito de dentro da t2, esperando por t1, e t3 deveria dar um join para esperar por t2 …
da forma como vc esta fazendo, as threads não startam simultaneamente…