Ajuda thread  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
Jedi_FeniX
Virtual Machine Man
[Avatar]

Membro desde: 26/04/2007 14:32:30
Mensagens: 586
Offline

Estou precisando de uma ajuda....
O problema é este:
Tenho que pegar no banco uma quantidade x de linhas de uma determinada tabela, com essas linhas na memória tenho que imprimir na tela só que com 5 threads.

Fiz um exemplo para melhor entendimento do problema:



Sempre quando executo o código dá esta exception:


Exception in thread "main" java.lang.IllegalThreadStateException
at java.lang.Thread.start(libgcj.so.7rh)


Esta lógica está certa?
Desde já agradeço a ajuda de todos!!!!

This message was edited 2 times. Last update was at 25/01/2008 17:23:31


www.bau-de-dev.com
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline

Você não pode chamar o método start() mais de uma vez.

Experimente trocar:


Por:


PS: Para que vc precisa de tantas threads?

This message was edited 1 time. Last update was at 25/01/2008 17:41:39


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Jedi_FeniX
Virtual Machine Man
[Avatar]

Membro desde: 26/04/2007 14:32:30
Mensagens: 586
Offline

Mas ai quando o "for" continuar o programa não vai ficar criando várias trheads?
Esse print depois vai virar uma url que irá fazer vários request a vários pcs, com isso eu aumento a velocidade do programa....

www.bau-de-dev.com
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline

Para que você criou o for, em primeiro lugar?


@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Jedi_FeniX
Virtual Machine Man
[Avatar]

Membro desde: 26/04/2007 14:32:30
Mensagens: 586
Offline

O primeiro for é para pegar aos poucos os dados do banco e o segundo é para fazer request com estes dados que eu recuperei do banco. Que no meu caso eu gostaria de fazer este request 5 em 5.

Por exemplo recuperei no total 50 linhas.
Pego 5 llinhas monto as querys com os dados da mesma e faço 5 requests.

www.bau-de-dev.com
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline

Você então pega poucos dados e dispara 5 threads para trata-los, é isso?
E depois pega mais uns poucos e dispara mais 5 threads?

É claro que o for que eu te indiquei dispara várias threads, mas me parece que é exatamente isso que vc quer fazer, não é?

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Jedi_FeniX
Virtual Machine Man
[Avatar]

Membro desde: 26/04/2007 14:32:30
Mensagens: 586
Offline

Isso mesmo...
Mas neste for que vc indicou não vai ficar craindo muita thread? por exemplo tenho um for de 100, não vai ser criado 100 threads?

www.bau-de-dev.com
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline

Bom, é melhor você repensar a lógica.

O seu DAO está lendo o banco todo. Pense numa lógica, primeiro, para dividir esse banco todo em N partes iguais (provavelmente, gerando N listas de igual tamanho).

Vai ter que mudar aquele for ali, que está indo de linha em linha. Já que vc vai trabalhar de "grupos de linhas" em "grupos de linhas".

Depois, monte um Runnable para trabalhar um desses grupos de linhas. Então, altere seu código para disparar esses Runnables de 5 em 5 (nem que ainda não seja em paralelo).

Finalmente, adicione as threads, que executam seu Runnable em paralelo, e a sincronização necessária (provavelmente só um join() será suficiente).

Depois de tudo isso, você ainda pode otimizar o código usando um ExecutorService ao invés de criar as threads com new, isso fará um Pool de threads, permitindo que você "reproveite threads" e garantindo que várias threads não sejam criadas e destruídas. Por isso, recomendo que você implemente Runnable ao invés de extender thread.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
Jedi_FeniX
Virtual Machine Man
[Avatar]

Membro desde: 26/04/2007 14:32:30
Mensagens: 586
Offline

Eu tentei várias coisa para não ter que ler o banco todo e nem ir 2x no mesmo, mas por falta de tempo acabei usando esta lógica mesmo, vc teria alguma sugestão para dividir o banco em N partes sem ter quer lê-lo todo?

E quanto as threas vou seguir o seu conselho, mas vou ter que dar uma estudada para poder impementar desta maneira, vc poderia indicar por onde posso começar?

Muito obrigado pelas ajudas!!!

www.bau-de-dev.com
ViniGodoy
Moderador
[Avatar]

Membro desde: 11/12/2006 08:22:01
Mensagens: 20581
Localização: Curitiba/PR
Offline

Deixe a leitura do banco em um passo só mesmo. Divida o que foi lido.
Como não são várias máquinas que vão ler do banco, não há ganho significativo.

Agora, você deve criar listas menores para que suas threads processem.

Isso tornará o acesso as listas "thread-safe" (já que cada thread terá a sua própria lista). Se você mantiver uma lista só, e fazer todas as threads percorrerem a mesma lista, terá que se incomodar com sincronização.

@ViniGodoy - Lattes

Tem dúvidas de Java? Poste no fórum! Não respondo dúvidas de java via MP!

Ponto V! - Desenvolvimento de Jogos Profissional - @Pontov - Facebook
Projeto Towel - Swing de uma forma inteligente (Novo lar do ObjectTableModel e do Auto-Filtro).

Ei... você está usando DefaultTableModel no seu projeto??
Não faça isso! Veja: http://www.guj.com.br/posts/list/15/199067.java#1001295
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team