CodeGym /Cursos /All lectures for PT purposes /Pare o fluxo furioso: a versão não oficial

Pare o fluxo furioso: a versão não oficial

All lectures for PT purposes
Nível 1, Lição 142
Disponível

"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."

Comentários
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION