"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
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

if (!ClockManager.isClockRun)
return;
}
}
}

A classe Clock escreve «Tick» no console uma vez por segundo para sempre

Se ClockManager.isClockRun for false, o método run será finalizado.

class ClockManager
{
public static boolean isClockRun = true;
public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
isClockRun = false;
}

}
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
class Clock implements Runnable
{
private boolean isCancel = false;

public void cancel()
{
this.isCancel = true;
}

public void run()
{
while (!isCancel)
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
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.

public static void main(String[] args)
{
Clock clock = new Clock();
Thread clockThread = new Thread(clock);
clockThread.start();

Thread.sleep(10000);
clock.cancel();
}
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."