"Olá, amigo! Aqui está uma pergunta interessante que você já teve ou terá em breve. Como parar um thread em execução? "
Digamos que o usuário diga ao programa para “baixar um arquivo da Internet”. O encadeamento principal cria um encadeamento filho separado para este trabalho e passa a ele um objeto cujo método de execução contém todas as ações necessárias para baixar o arquivo.
Mas de repente o usuário muda de ideia. Ele não quer baixar o arquivo. Como cancelamos um trabalho e paramos o thread?
"Sim, diga-me como?"
" Não podemos. Essa é a resposta mais comum e mais correta. Você não pode interromper um tópico. Somente ele pode interromper a si mesmo. "
Mas você pode enviar um sinal para um thread, de alguma forma informando que o trabalho não precisa mais ser executado e que deve ser encerrado. Assim como a thread principal termina retornando do método main, uma thread filha termina retornando do método run.
"Qual é a melhor maneira de fazer isso?"
"Você pode adicionar alguma variável, como um boolean . Se for true , o thread é executado. Se for false , o thread deve terminar. Assim, por exemplo:"
Código | Descrição |
---|---|
|
A classe Clock escreve «Tick» no console uma vez por segundo para sempre Se ClockManager.isClockRun for false, o método run será finalizado. |
|
O thread principal inicia um thread filho (relógio) que deve ser executado para sempre
Aguarde 10 segundos e dê um sinal para o relógio terminar. O thread principal conclui seu trabalho. O thread do relógio termina seu trabalho. |
"E se tivermos vários tópicos, e daí?"
"É melhor ter essa variável para cada thread. É mais conveniente adicioná-la diretamente à classe. Você pode adicionar uma variável booleana isRun lá. No entanto, é melhor adicionar uma variável booleana isCancel que se torna verdadeira se a tarefa for cancelado."
Código | Descrição |
---|---|
|
A classe Clock grava a palavra «Tick» no console uma vez por segundo, desde que isCancel seja falso.
Quando isCancel se torna verdadeiro, o método run termina. |
|
O thread principal inicia um thread filho (relógio) que deve ser executado para sempre
Aguarde 10 segundos e cancele a tarefa chamando o método cancel. O thread principal conclui seu trabalho. O thread do relógio termina seu trabalho. |
"Vou manter isso em mente. Obrigado, Ellie."
GO TO FULL VERSION