Qual a impressão que vc está tendo, pq vc acha q o sync nao está funcionando ?
ricardolecheta
se eu faço Thread.sleep(500), não deveria levar um 0.5 segundos entre cada impressão?
por exemplo, uma Thread entra, dorme 0.5 seg e imprime “nome + " : " + i”, mas sempre as Threads imprimem juntas… entende?
sei que é um problema de conceito meu, e não que está acontecendo algo errado…
mas para mim, uma thread deveria imprimir, depois de 0.5 seg outra e assim por diante…
R
Rosauro_Barcia_Fonse
Rodei seu programa com um sleep maior e não pareceu-me que os caracteres abcde estão syncronizados com i .Tire fora o synchonized de print e o programa roda igual .Veja o exemplo abaixo onde eu quero sincronizar os parenteses com uma mensagem.
classParenteses{//rode o programa com e sem synchronized.synchronizedvoidprint(Stringmsg){System.out.print("("+msg);try{Thread.sleep(1000);}catch(InterruptedExceptionex){System.out.println("Interrompeu");}System.out.println(")");}}---------------------------------------------------publicclassChamaRunimplementsRunnable{Stringmsg;Parentesesalvo;Threadt;publicChamaRun(Parentesestarget,Stringst){alvo=target;msg=st//O this aqui é uma instancia de ChamaRun e//chama run() neste objeto.t=newThread(this);t.start();}publicvoidrun(){alvo.print(msg);}}------------------------------------------------classSincronizadorapublicstaticvoidmain(Stringargs[]){Parentesesalvo=newParenteses();ChamaRunobjeto1=newChamaRun(alvo,"Aqui");ChamaRunobjeto2=newChamaRun(alvo,"Esta");ChamaRunobjeto3=newChamaRun(alvo,"Sincronizado");//A thread de main espera as threads terminarem.try{objeto1.t.join();objeto2.t.join();objeto3.t.join();}catch(InterruptedExceptione){System.out.println("Interrompeu");}}}//Adaptado do livro The Complete Reference .5.EDITION//Herbert Schildt -OSBOURN
Espero ter ajudado.
cariocathi
Cara, já entendi seu problema.
É o seguinte:
Há três estados q um programa pode assumir no sistema operacional. Executando, Pronto e Bloqueado. Qnd vc starta as threads, todas elas estão prontas, mas como só é possível executar uma de cada vez elas vao pra fila de prontos e o escalonador escolhe uma pra começar a execução. Ele executa o método e como vc dá um sleep na thread, ela vai para os bloqueados, dando a vez para o próximo da fila. Entendeu ???
Vc starta a thread, ela bloqueia( sleep ) e a proxima executa e tb bloqueia e assim por diante, pra fazer do jeito q vc quer uma letra 0,5s depois da outra, vc deve usar uma thread ou monitores ou semáforos…