ThreadGroup  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
phillip666
JavaChild

Membro desde: 28/02/2005 10:57:23
Mensagens: 138
Offline

Pessoa preciso fazer um esquema tipo assim, meu sistema precisa imprimir várias coisas dai eu também preciso ficar fazer outras coisas nesse mesmo tempo então a minha idéia é a seguinte, eu faço essas outras coisas e faço a impressão dentro de um thread, tá até aí de boa mas agora entre meu problema são várias coisas que eu tenho que fazer então significa várias thread daí eu quero colocar esse threads dentro de um ThreadGroup. Qual seria a melhor maneira de fazer isso????

Obrigado pela ajuda.
ViniGodoy
Moderador
[Avatar]

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

Não use o ThreadGroup. Péssima idéia. A classe ThreadGroup é famosa por dar problemas. Se for no Java 5, use um ExecutorService.

É muito fácil, primeiro você cria um executor service:



Além do CachedThreadPool a classe Executors também te dá a possibilidade de criar Pools de tamanho fixo, tamanho único ou "agendáveis". Escolha o mais adequado para você.

Depois, você usa o seu ExecutorService para disparar os seus Runnables:



Se suas Threads retornam algum valor, considere usar um Callable ao invés de um Runnable. Basicamente, um Callable é um Runnable que retorna valor.

O que é aquele objeto Future retornado? Ele vai guardar o resultado da sua operação futura. A grande vantagem é que ele possui o método get() que espera até que a Thread obtenha o resultado do Callable (ou finalize o método run()).

Portanto, para esperar sua Thread terminar, basta fazer:
result.get();

Quando você terminar (ou quiser terminar) um ExecutorService usa o método shutdown(). Ele proibirá novas Threads de entrarem no Pool e aguardará pacificamente que as demais Threads sejam finalizadas.

Se sua intenção é chamar o interrupt() de todas as Threads, além de finalizar o Pool, use shutdownNow() ao invés de shutDown().
[WWW]
ViniGodoy
Moderador
[Avatar]

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

Fiz esse exemplinho com o uso do ExecutorService, Callable e Future.

Experimente depois alterar o código para calcular 10 primos (pode ser primos pequenos, anteriores ao milésimo), mas troque o ThreadPool para um FixedThreadPool de apenas 3 threads. Veja como o programa se comporta, é bastante interessante!

Tomara que ajude!
 Nome do arquivo FutureSample.java [Disk] Download
 Descrição Mostra como calcular o 1000º, 10000º e o 20000º usando três threads. Utiliza as classes Callable, para o calculo, Future, para obtenção do resultado, e ExecutorService, que cria um Pool de Threads que serão usadas no cálculo.
 Tamanho 3 Kbytes
 Baixado:  570 vez(es)

[WWW]
phillip666
JavaChild

Membro desde: 28/02/2005 10:57:23
Mensagens: 138
Offline

OU valeu pela ajuda ou dar uma estuda nisso que eu preciso disso o mais rápido possível, agora me responde uma coisa, tipo eu queria fazer uma esquema que cada nova thread criada fosse agenda numa fila de espera, tipo igual fila de supermercado, que chega primeiro sai primeiro, dessa maneira que você me falou tem como fazer isso????/

Valeu e obrigado pela atenção.
ViniGodoy
Moderador
[Avatar]

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

Não entendi. O que você quer dizer com Threads numa fila de espera?

As Threads rodam juntas, em paralelo. Você pode não disparar as Threads, ou usar um ThreadGroup de tamanho fíxo (de 1 ou 2), por exemplo. Aí vc vai rodar uma Thread de cada vez.

Agora, uma vez que estão todas rodando juntas, não tem como dizer quem vai executar. Use como regra que elas sempre estão rodando ao mesmo tempo.
[WWW]
phillip666
JavaChild

Membro desde: 28/02/2005 10:57:23
Mensagens: 138
Offline

Cara eu até concordo com você sobre isso mas é que meu caso é um seguinte, tipo para cada produto que eu vendo no caixa eu mando pra impressora, então daí eu tenho que esperar imprimir para poder passar o próximo produto, tá até aí beleza só que a gente vai mudar isso, tipo eu vou passar o produto e vou mandar imprimir,e não preciso ficar esperando imprimir pra poder passar o próximo, daí cada pedido de impressão será um thread tá até aí beleza também, mas tipo na ordem que eu passar o produto é a ordem que eu tenho que imprimir por isso eu dei o exemplo da fila, quem chega primeiro sai primeiro.
ViniGodoy
Moderador
[Avatar]

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

Nesse caso, a classe que controla a impressora é que rodará numa Thread, com uma fila de mensagens.

A sua Thread simplesmente submete vários trabalhos de impressão para essa classe, que vai processar quando puder.

É um caso típico do Algoritmo do Produtor/Consumidor. A impressora é a consumidora e sua classe, a produtora.
[WWW]
phillip666
JavaChild

Membro desde: 28/02/2005 10:57:23
Mensagens: 138
Offline

Cara entendi a sua idéia e achei muito melhor que a idéia que eu tive.......................
ismael.j.lima
Entusiasta Java

Membro desde: 06/06/2008 15:58:11
Mensagens: 24
Offline

Me desculpem a minha ignorancia, mas pelos testes que eu fiz eu não encontrei vantagem em utilizar o callable.
eu criei um metodo q calculasse um numero e tds os seus antecessores. criei esse metodo como parte da classe principal e criei o msm metodo dentro de um callable, exatamente igual.
esta assim

cria o threadpool
da um submit chamando o callable
chama o metodo local
chama o metodo get


acontece q eu pego o tempo antes e dps de chamar o metodo local, e o tempo antes e dps de chamar o metodo get.
o tempo do metodo get, demora +- 3 vezes o tempo do metodo local....
entanglement
GUJ Hacker

Membro desde: 26/09/2009 09:18:56
Mensagens: 5750
Offline

ismael.j.lima wrote:Me desculpem a minha ignorancia, mas pelos testes que eu fiz eu não encontrei vantagem em utilizar o callable.
eu criei um metodo q calculasse um numero e tds os seus antecessores. criei esse metodo como parte da classe principal e criei o msm metodo dentro de um callable, exatamente igual.
esta assim

cria o threadpool
da um submit chamando o callable
chama o metodo local
chama o metodo get


acontece q eu pego o tempo antes e dps de chamar o metodo local, e o tempo antes e dps de chamar o metodo get.
o tempo do metodo get, demora +- 3 vezes o tempo do metodo local....


É claro que não tem vantagem se você não der uma quantidade de trabalho suficiente para trabalhar. Toda a burocracia necessária para criar threads é pesada, e isso é que deve ter deixado o seu programa mais lento. É mais ou menos como você mandar um boy ao banco - você pode dar um monte de contas para ele pagar, ou você pode mandá-lo com uma conta de cada vez para ele pagar. Demora muito mais se você der um pouquinho só de trabalho de cada vez - mesmo que você tenha 4 ou 8 boys (threads ou CPUs) tentando fazer o mesmo trabalho simultaneamente.
ismael.j.lima
Entusiasta Java

Membro desde: 06/06/2008 15:58:11
Mensagens: 24
Offline

Entendi....a minha principal duvida era se o callable executava o metodo call() na hora que o future chama o get(), mas fiz uns testes e verifiquei que o call era chamado exatamente no momento do instanciamento....


v lw pessoal...
vcsmetallica
JavaEvangelist
[Avatar]

Membro desde: 18/06/2008 14:22:41
Mensagens: 479
Localização: Belo Horizonte
Offline

Galera,

No caso eu preciso ler uma Lista e cada item desta lista entrar em um Thread.
Como que eu voi pegar o resultado de cada item?

Att
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team