domingo, 29 de agosto de 2010

Re: [java-br] Problema com multithread

·

 

Olá Fabiano, tenta algo como o codigo abaixo:

//inicia threads 1, 2 e 3
tA1.start();
tA2.start();
tA3.start();

//So apos iniciar as tres primeiras threads chama os joins,
//caso seus metodos estejam corretamente implementados as
//threads 1, 2 e 3 vao estar rodando em turnos (cuidado com situacoes de deadlock).

//indica que a principal deve esperar a thread 1 acabar antes de voltar ao estado de runnable
tA1.join();
//indica que a principal deve esperar a thread 2 acabar
tA2.join();
//indica que a principal deve esperar a thread 3 acabar
tA3.join();

//nesse ponto as 1, 2 e 3 ja acabaram e as 4 e 5 sao iniciadas
tA4.start();
tA5.start();

//Novamente, so apos iniciar as threads 4 e 5 chama os joins
tA4.join();
tA5.join();

//inicia a 6 apos acabar a 4 e a 5
tA6.start();

E no caso do seu outro e-mail, se vc mudasse o codigo de:

while(tA1.isAlive() && tA2.isAlive() && tA3.isAlive(){

}

para o codigo abaixo, onde vc muda os "&&" para "||":

while(tA1.isAlive() || tA2.isAlive() || tA3.isAlive(){

    //so para garantir que as outras threads terao seus turnos
    try {
            Thread.sleep(100);
     }
    catch (InterruptedException ex) {
    }
}

Surtiria efeito similar, mas como vc não precisa que a thread principal rode, a primeira abordagem é a mais natural.

O capitulo 9 do likvro "SCJP Sun Certified Programmer for Java 6 Study Guide" explica alguns conceitos de threads, vale a pena dar uma olhada.

Seguem abaixo tbm alguns links com alguns bons exemplos:

Exemplos de join: http://www.java2s.com/Code/JavaAPI/java.lang/ThreadjoinUsingjointowaitforthreadstofinish.htm e
http://www.java2s.com/Code/Java/Threads/Understandingjoin.htm

Outros exemplos com threads no msm site: http://www.java2s.com/Code/Java/Threads/Simple-Threads.htm
e http://www.java2s.com/Code/Java/Threads/CatalogThreads.htm

Espero ter ajudado.

Att,

Rafael

--- Em sáb, 28/8/10, Fabiano Netto <fabianolistas@gmail.com> escreveu:

De: Fabiano Netto <fabianolistas@gmail.com>
Assunto: Re: [java-br] Problema com multithread
Para: java-br@yahoogrupos.com.br
Data: Sábado, 28 de Agosto de 2010, 15:27

Pedro

O If acho que não, talvez um while

Tentei ate algo do tipo

while(tA1.isAlive() && tA2.isAlive() && tA3.isAlive(){

}

Mas acontece que ao acabar as threads 2 e 3 ele ja continuou e não esperou a
tA1 acabar

Valeu

Em 28 de agosto de 2010 15:11, Pedro Henrique Castro Silva <
phcastro03@yahoo.com.br> escreveu:

>
>
> Amigo nunca trabalhei com thread`s, mas no caso um if após disparar a 3
> thread e
> finalizá-la não funciona?
>
> Abraço
>
> ________________________________
> De: Fabiano Netto <fabianolistas@gmail.com <fabianolistas%40gmail.com>>
>
> Para: java-br@yahoogrupos.com.br <java-br%40yahoogrupos.com.br>
> Enviadas: Sábado, 28 de Agosto de 2010 15:00:26
> Assunto: [java-br] Problema com multithread
>
>
> Pessoal,
>
> É o seguinte, estou precisando resolver uma situação e não achei nos sites
> de java algo didaticamente facil de entender
>
> Vou tentar reproduzir aqui minha situação.
>
> Tenho uma classe A que possui 6 métodos, que chamarei aqui de a1, a2, a3,
> a4, a5 e a6
>
> Já criei 6 threads que, na prática, cada uma chama um desses métodos da
> minha classe A, ou seja, criei algo do tipo
>
> public class tA1 extends thread{
> private A a;
>
> public tA1(A a){
> this.a=a;
> }
>
> private void run{
> a.a1();
> }
> }
>
> Isso se repete nas classes tA2, tA3, tA4, tA5, tA6
>
> Minha classe main é algo do tipo
>
> public static void main (String args[]){
> A a1 = new A();
> A a2 = new A();
> A a3 = new A();
> A a4 = new A();
> A a5 = new A();
> A a6 = new A();
>
> Thread tA1 = new tA1(a1);
> Thread tA2 = new tA1(a2);
> Thread tA3 = new tA1(a3);
> Thread tA4 = new tA1(a4);
> Thread tA5 = new tA1(a5);
> Thread tA6 = new tA1(a6);
>
> //Disparar as threads 1, 2 e 3
> tA1.start();
> tA2.start();
> tA3.start();
> }
>
> Agora que vem a minha questão, eu preciso que a main aguarde o fim da
> execução das 3 threads para então disparar as threads 4 e 5, depois
> aguardar
> que as 2 finalizem para disparar a 6.
>
> Eu tentei inicialmente fazer algo do tipo
> tA1.join();
> tA2.join();
> tA3.join();
>
> Só que isso faz com que apos o join da tA1 nada mais seja executado senão a
> própria tA1 e eu quero que tA1, tA2 e tA3 sejam executados em paralelo.
>
> Obrigado
>
> Abs
> Fabiano Netto
>
> [As partes desta mensagem que não continham texto foram removidas]
>
> [As partes desta mensagem que não continham texto foram removidas]
>

>

[As partes desta mensagem que não continham texto foram removidas]

------------------------------------

Para sair da lista, envie email para: java-br-unsubscribe@yahoogroups.com
Para upload/download de arquivos: http://www.yahoogroups.com/files/java-brLinks do Yahoo! Grupos

[As partes desta mensagem que não continham texto foram removidas]

__._,_.___
Atividade nos últimos dias:
Para sair da lista, envie email para: java-br-unsubscribe@yahoogroups.com
Para upload/download de arquivos: http://www.yahoogroups.com/files/java-br
Homens em busca de um grande amor. E se esta pessoa for você?

Procurando Um Novo EMPREGO Em 2010? Faça Já Uma Busca de Vagas Aqui!
.

__,_._,___

0 comentários:

Pague com LPs do Mister Colibri

Pague com LPs do Mister Colibri
Quer comprar celular,Tablet,pen drive, GPS e muito outros produtos e ainda podendo pagar tudo em LPs ?Pois saiba que isso é possível,basta você visitar o site downloadstotal.com e realizar a sua compra com toda tranquilidade e segurança!!!

Hora

Online

Arquivo do Blog