d2 = new DispositivosNormais(5, 7);
d2.transmitir(ar1);
em outra thread t3.
Minha pergunta é da pra fazer isso com thread? e se sim, como eu posso fazer isso? Já tentei usar threads mas não consigo passar o metodo transmitir(arg) de jeito nenhum. Até pensei em usar o método run() passando argumentos nele, mas parece que isso não é possível. Enfim alguém poderia me dar uma help?
Muito grato ViniGodoy. Aparentemente as threads estão preparadas para rodar paralelamente.
mas agora eu estou com outro problema. O codigo ficou assim:
packagebr.com.rad.radiocog;importjava.util.ArrayList;publicclassEstudos2{publicstaticvoidmain(String[]args)throwsInterruptedException{finalArar1=newAr();finalDispositivosNormaisd1=newDispositivosNormais(0,5);finalDispositivosNormaisd2=newDispositivosNormais(5,7);finalRadioCognitivor1=newRadioCognitivo(ar1,0,50);newThread(newRunnable(){publicvoidrun(){try{System.out.println("thread1");r1.transmitir(ar1);}catch(InterruptedExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}}).start();newThread(newRunnable(){publicvoidrun(){try{System.out.println("thread2");d1.transmitir(ar1);}catch(InterruptedExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}}).start();newThread(newRunnable(){publicvoidrun(){try{System.out.println("thread3");d2.transmitir(ar1);}catch(InterruptedExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}}).start();System.exit(0);}}
E quando eu mando executar, o resultado é os prints:
thread1
thread2
e não executa o thread3. Eu fiquei pensando que pode ser problemas de sincronização, já que o Objeto Ar ar1 é compartilhado entre as threads. Então eu distribui synchronized em todos os metodos que estou usando até agora. E imagina só! Nada, continua executando somente a 1 e 2 thread. Mas na verdade o que esta acontecendo é que o programa termina assim que printa thread1 e thread2. Então fico sem saber se a thread3 poderia ser executada ainda. Sinceramente não sei onde esta o problema… tens alguma idéia do que estou fazendo de errado?
obrigado
ViniGodoy
O código de threads é disparado em paralelo.
Portanto, assim que o método start() é executado, a nova thread começa a executar. Quem decide a ordem de execução (pois o paralelismo real é raro) é o sistema operacional.
Provavelmente seu código está atingindo o System.exit(0) antes que a thread3 tenha chance de executar pela primeira vez.
Esse comando mata o processo, eliminando todas as threads em execução.
Aliás, para que você colocou o System.exit ali?
Se você colocar um Thread.sleep(5000); antes do comando, para pausar a main thread por 5s, provavelmente verá as três threads executando.
ViniGodoy
Use o join() se quiser esperar uma thread parar de rodar.
packagebr.com.rad.radiocog;importjava.util.ArrayList;publicclassEstudos2{publicstaticvoidmain(String[]args)throwsInterruptedException{finalArar1=newAr();finalDispositivosNormaisd1=newDispositivosNormais(0,5);finalDispositivosNormaisd2=newDispositivosNormais(5,7);finalRadioCognitivor1=newRadioCognitivo(ar1,0,50);Threadthread1=newThread(newRunnable(){publicvoidrun(){try{System.out.println("thread1");r1.transmitir(ar1);}catch(InterruptedExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}});Threadthread2=newThread(newRunnable(){publicvoidrun(){try{System.out.println("thread2");d1.transmitir(ar1);}catch(InterruptedExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}});Threadthread3=newThread(newRunnable(){publicvoidrun(){try{System.out.println("thread3");d2.transmitir(ar1);}catch(InterruptedExceptione){// TODO Auto-generated catch blocke.printStackTrace();}}});//Dispara as tres threads juntasthread1.start();thread2.start();thread3.start();//Espera elas terminaremthread1.join();thread2.join();thread3.join();//Só depois roda o exit.System.exit(0);}}