Ver mensagens sem resposta | Ver tópicos ativos Hoje é 18 Nov 2017, 00:10



Responder Tópico  [ 3 Mensagens ] 
 Estratégia para Encerramento de Threads 
Autor Mensagem
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Estratégia para Encerramento de Threads
A grande maioria das threads que usamos deixamos encerrar naturalmente ao encerrar a tarefa que estamos executando. Ou seja, ao encerrarmos o Runnable a thread encerra também.
Mas, existem alguns casos em que uma thread tem uma duração infinita. Digo, no sentido "infinito enquanto dure" do Vinicius de Moraes...
No Java não temos uma maneira direta de encerrar uma thread. Temos de solicitar o encerramento da thread via um "recado".
Uma forma é usar uma variável booleana para indicar a intenção de que desejamos encerrar o processo em execução.
Deve-se definir essa variável como volatile ou sincronizar os acessos a ela, senão o "recado" pode não chegar à thread destinatária.
Mas, essa forma não resolve todos os casos, se a tarefa estiver bloqueada por algum motivo, e se não sair do bloqueio, não verá o pedido de encerramento.
Para esses casos, temos a opção de usarmos o método da thread chamado interrupt(). Esse método liga uma variável de status da thread que indica que foi solicitado uma interrupção. Aí é só verificar essa variável com o método isInterrupted() para saber se o encerramento foi solicitado, ou, se estiver bloqueado por algum método que responda a interrupção, vai receber um InterruptedException.
O importante é que precisamos definir uma estratégia de encerramento para as threads. Devemos definir claramente, como solicitar o encerramento, quando a tarefa deve verificar se foi solicitado o encerramento e, finalmente, quais procedimentos realizar para encerrar a tarefa.

Isso é fundamental no Android, senão, podemos ter threads "trabalhando" mesmo com a app em background.

PS1: Temos alguns casos em que o recurso que está bloqueando não responde à interrupção, nesses casos, devemos usar uma tática diferente para cada caso, mas, como regra geral, fechamos/encerramos o recurso, o que acarretará alguma Exception.

PS2: Se estiver bloqueado por trava, só vai avançar se obtiver a trava.

PS3: Se estiver usando AsyncTask, usar cancel() para solicitar o encerramento e no doInBackground() verificar se foi solicitado o encerramento via isCanceled().

PS final: Se você usa uma outra estratégia, posta aqui para termos outra abordagem!

Abraços

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


16 Mar 2013, 22:07
Perfil
Google employee
Google employee

Data de registro: 28 Jun 2012, 19:13
Mensagens: 1308
Localização: Itaperuna-RJ
Mensagem Re: Estratégia para Encerramento de Threads
Sempre acho que vou fazer algo errado quando dou um new Thread(), Gusukuma, qualquer thread que eu faça, até um simples sql no banco ou um download eu preciso me preocupar com o encerramento dela?

_________________
Powell


02 Abr 2013, 10:55
Perfil
Google employee
Google employee

Data de registro: 17 Jul 2011, 11:55
Mensagens: 2657
Localização: São Paulo
Mensagem Re: Estratégia para Encerramento de Threads
Normalmente, não. Somente nos casos mais demorados, ou, quando tem um loop repetindo a execução da tarefa.
Tem que verificar caso a caso.

_________________
Abraços
___________
Novo App: CalcMat - Calculadora de materiais para concreto
Blog: Agorandroid - sobre programação Android
Twitter: @Agorandroid
___________
Campanha: Facilite sua vida e a dos outros usuários
Cuide do ciclo de vida do seu tópico:
no onCreate(): seja claro, se necessário poste o código e as mensagens de erro.
no onClick(): responda às sugestões.
no onStop(): evite "ninguém?", "alguém?", etc. Procure acrescentar alguma nova informação.
no onDestroy(): resolvido o assunto, poste imediatamente a solução, e, coloque no título do primeiro post [Resolvido].


02 Abr 2013, 13:00
Perfil
Mostrar mensagens anteriores:  Organizar por  
Responder Tópico   [ 3 Mensagens ] 

Quem está online

Usuários vendo este fórum: ademir.carvalhojr, Aderbal Nunes, adilson, Adriano, aechiara, Alan Unger, alberto, Alex Marcelo Burnett, Alexandre de Queiroz, alexmarcolongo, amos, andrelom, Androidthebest, ARAKINIDIO, b7web, blurkness, BornSlip, btleandro, btminzon, buccalon, carminati, Chewbacca, china, claudioalfonso, craudiao, Cristranus, danilosouza, Darth Sidious, dbispo, dchechetto, deborazb, dfreitas, Diego Otani, difrene, Dookan, dramos, Dudi_FC, ederson_4, eluttner, emersonalencar, eusobacana, eXagon, Faroli, felipedornelas, FelipeOliveira, flashking, frederico.affini, Governador Wilhuff Tarkin, helder84, henrique.garcia, hugomarinho, humberto, HyagoRules, Ielo8, infonlinebr, jairodealmeida, jairom, Jar Jar Binks, jhou, José Guilherme, jpespindola, klausenner, lafamac, leonardodamata, lucianno, Marcelo, MarceloLuz, marcelorferrari, marcelosv, mendes_lu, mmfsndroid, msmdark, oliverlessa, On_7, paulo.weber, paulovaz, peixe, pemam.com.br, pgsnit, Philipe Alves, Portal Android, Qui-Gon Jinn, Rafael Alencar, rafael.cioban, rafaelmonoh, regeriob2br, renatocoliveira, roberto caceres, Robson Florentino, rogerio.alcantara, ROGÉRIO RODRIGUES, romulotales, siker C3PO, Snappy [Bot], srmoreira, Synoo [Bot], Teodoro, thanaptos, Thelemita, thienne, tiagoxv, Toks, tonylock, unnamedd, Velhinho, viniciusllima, Webnet, wingdoido, Wryel, Yoshihury e 2 visitantes


Você não pode criar novos tópicos neste fórum
Você não pode responder tópicos neste fórum
Você não pode editar suas mensagens neste fórum
Você não pode excluir suas mensagens neste fórum
Você não pode enviar anexos neste fórum

Procurar por:
cron

© 2007 - 2016 Portal Android - Comunidade de Desenvolvedores Android

Estamos no Linkedin    Siga-nos no twitter


Powered by phpBB - Hospedado por Bemobi