como eu faço para interromper todas as threads lançadas por uma única thread?  XML
Índice dos Fóruns » Java Avançado
Autor Mensagem
renatotn7
JavaChild

Membro desde: 23/11/2006 14:30:14
Mensagens: 139
Offline

olá,

como eu faço isso?
eduveks
GUJ Ranger
[Avatar]

Membro desde: 19/04/2005 07:45:40
Mensagens: 831
Localização: Lisboa - Portugal
Offline

Guarda as Threads num Array...

E depois quando quiser interromper, é só percorrer o Array e interromper as que quiser...


http://www.cajuscript.org
http://eduveks.blogspot.com
[Email] [WWW]
fabio.patricio
GUJ Master

Membro desde: 04/01/2004 02:51:33
Mensagens: 1512
Localização: Porto Alegre - RS
Offline

Olá,

Utilize um ThreadGroup para agrupar estas threads e quando precisar interrompe-las, chame o metodo interrupt do ThreadGroup.

Da uma olhada no Javadoc dela.

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ThreadGroup.html

]['s

Fabio Patricio
http://blog.wansoft.com.br

[WWW] [MSN] [ICQ]
eduveks
GUJ Ranger
[Avatar]

Membro desde: 19/04/2005 07:45:40
Mensagens: 831
Localização: Lisboa - Portugal
Offline

fabgp2001 wrote: Olá,

Utilize um ThreadGroup para agrupar estas threads e quando precisar interrompe-las, chame o metodo interrupt do ThreadGroup.

Da uma olhada no Javadoc dela.

http://java.sun.com/j2se/1.5.0/docs/api/java/lang/ThreadGroup.html

]['s


Bem mais elegante

http://www.cajuscript.org
http://eduveks.blogspot.com
[Email] [WWW]
renatotn7
JavaChild

Membro desde: 23/11/2006 14:30:14
Mensagens: 139
Offline

alguem tem algum exemplo?
fabio.patricio
GUJ Master

Membro desde: 04/01/2004 02:51:33
Mensagens: 1512
Localização: Porto Alegre - RS
Offline

renatotn7 wrote:alguem tem algum exemplo?


Exemplo de como criar um ThreadGroup?

É simples.

Cria uma ThreadGroup dando um nome pra ela.



Depois passa esse thread group para as threads que vão sendo criadas.



Depois pra interromper.



Por fim tu ainda pode ver se existe alguma thread ativa. É so da uma olhada na API e brincar com a classe. Ou ainda se precisar de algo mais complexo, olhar o pacote java.util.concurrence do Java 5.


]['s
[WWW] [MSN] [ICQ]
ViniGodoy
Moderador
[Avatar]

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

O método interrupt não para a thread, a menos que ela seja programada para reagir a ele. Ele fará com que waits gerem interruptedException e o método Thread.isInterrupted() (caso o interrupt seja lançado fora de um wait) retorne true.

Você terá que fazer whiles do tipo:



Existe o método suspend(), que efetivamente mata a thread, mas ele foi deprecated por ser muito propenso a falhas e a gerar deadlocks.

O ideal é que os objetos por onde a thread vá percorrer estejam preparados para esse tipo de interrupção. Nesse caso, você já deve planejar de antemão o comportamento do código, para que o método run() finalize normalmente, se uma interrupção ocorrer.

O que você quer fazer, exatamente? Qual é o problema que está tentando resolver? Talvez se você descreve-lo podemos te ajudar com alguma dica.
[WWW]
fabio.patricio
GUJ Master

Membro desde: 04/01/2004 02:51:33
Mensagens: 1512
Localização: Porto Alegre - RS
Offline

Olá,

Pelo que sei ele até para a Thread, mas depende de varios fatores, SecurityManager, stado das threads, etc. Por isso é bom consultar a API pra não fazer besteira.

]['s

Fabio Patricio
http://blog.wansoft.com.br

[WWW] [MSN] [ICQ]
ViniGodoy
Moderador
[Avatar]

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

Ok, aqui vai um exemplo. Usei o interrupted e o ThreadGroup, conforme sugerido. Note que o tratamento do interrupt agora passa a ser consciente e desejado.

Outra forma de fazer isso é, ao invés de utilizar o interrupt, criar métodos no seu runnable e atributos de controle. Por exemplo, você poderia criar um atributo private volatile boolean naoMorreu = true, substituir o while por:



E depois fazer o metodo


Ainda assim, você ainda teria que se incomodar com a InterruptedException.

Entretanto, essa técnica é usual. Mais até do que usar o interrupt. Mesmo quando te impossibilitando usar o thread group diretamente.

No lugar do ThreadGroup, você passa a depender de uma lista - nesse caso, fazendo um for e chamando o método matar().

Escolha o que achar melhor!
 Nome do arquivo thread.zip [Disk] Download
 Descrição Dispara algumas threads, depois mata todas elas.
 Tamanho 1 Kbytes
 Baixado:  357 vez(es)

[WWW]
fabio.patricio
GUJ Master

Membro desde: 04/01/2004 02:51:33
Mensagens: 1512
Localização: Porto Alegre - RS
Offline

Tu chegou a testar o código?

Depois de um tempinho...

ViniGodoy
eduveks
renatotn7
fabgp2001
Thread com texto ViniGodoy finalizada.
Thread com texto fabgp2001 finalizada.
Thread com texto renatotn7 finalizada.
Thread com texto eduveks finalizada.

O problema é que as thread não são interrompidas de imediato, não sei qual a regra para a parada delas, mas elas são imterrompidas depois de algum tempo.

]['s

Fabio Patricio
http://blog.wansoft.com.br

[WWW] [MSN] [ICQ]
fabio.patricio
GUJ Master

Membro desde: 04/01/2004 02:51:33
Mensagens: 1512
Localização: Porto Alegre - RS
Offline

O unico problema que eu vejo com essa tecnica do atributo "nãoMorreu" é que o programador te que controlar o que a thread esta fazendo antes de para-la.

Por exemplo eu tenho uma thread que dispara comandos com o banco de dados, imaginemos que cada thread vai fazer insert e update em lote. Se eu simplesmente parar a thread sem me preocupar com o que ela está fazendo eu posso deixar estados inconsistente no meu sistema.

Isso seria semelhante a fazer um kill no meu processo o que muitas vezes não é o desejado.

]['s

Fabio Patricio
http://blog.wansoft.com.br

[WWW] [MSN] [ICQ]
ViniGodoy
Moderador
[Avatar]

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

Acho que você confundiu. Esse é o problema do suspend, não do não morreu. Ter que se preocupar com a thread é bom, justamente para garantir que ela não deixe o estado inválido.

Com o atributo no seu controle, você pode rodar algum código de finalização, caso a thread saia do while, e voltar a um estado consistente. Na verdade, essa técnica e descrita e recomendada por vários autores.
[WWW]
fabio.patricio
GUJ Master

Membro desde: 04/01/2004 02:51:33
Mensagens: 1512
Localização: Porto Alegre - RS
Offline

Vini,

Entendi, eu só to tentando alertar para se o cara for usar qualquer uma das abordagens ele tem que pensar em tudo isso. Nao da pra simplemente finalizar a thread (dar um kill) pois isso pode trazer grandes problemas no sistema.

]['s

Fabio Patricio
http://blog.wansoft.com.br

[WWW] [MSN] [ICQ]
ViniGodoy
Moderador
[Avatar]

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

Testei sim.

Após a chamada do interrupt (que ocorre 15 segundos depois que o programa começa a rodar), as threads são imediatamente interrompidas. Rode o código numa execução passo-a-passo, colocando um breakpoint na MainThread (de preferência na linha com o interrupt), que você verá isso mais claramente.
[WWW]
ViniGodoy
Moderador
[Avatar]

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

Ops, foi mal, achei que vc tinha feito confusão. Então está ok, pq estamos falando a mesma língua!

Na verdade... Eu até ressaltei isso nos comentários que coloquei no Runnable Printer.

Outra coisa interessante do atributo naoMorreu é que você pode fazer algum tipo de finalização antes de interromper a Thread.

Por exemplo:
[WWW]
 
Índice dos Fóruns » Java Avançado
Ir para:   
Powered by JForum 2.1.8 © JForum Team