„Здравей, Амиго! Ето един интересен въпрос, който or вече си задал, or скоро ще си зададеш. Как се спира работеща нишка?

Да приемем, че потребителят казва на програмата да «изтегли файл от интернет». Главната нишка създава отделна дъщерна нишка за това задание и й предава обект, чийто метод за изпълнение съдържа всички необходими действия за изтегляне на file.

Но изведнъж потребителят променя решението си. Той не иска да изтегли file. Как да анулираме задание и да спрем нишката?

— Да, кажи ми How?

" Не можем. Това е най-често срещаният и най-правилният отговор. Не можете да спрете нишка. Само тя може да спре сама себе си. "

Но можете да изпратите сигнал до нишка, като по няHowъв начин ѝ кажете, че работата вече не трябва да се извършва и че трябва да прекрати. Точно Howто основната нишка завършва с връщане от основния метод, дъщерната нишка завършва с връщане от метода run.

„Кой е най-добрият начин да направите това?“

"Можете да добавите няHowва променлива, като например boolean . Ако е true , нишката се изпълнява. Ако е false  , нишката трябва да прекрати. Като това, например:"

Код Описание
class Clock implements Runnable
{
public void run()
{
while (true)
{
Thread.sleep(1000);
System.out.println("Tick");

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

Класът Clock пише «Tick» на конзолата веднъж в секунда завинаги

Ако ClockManager.isClockRun е false, методът за изпълнение приключва.

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;
}

}
Основната нишка стартира дъщерна нишка (часовник), която трябва да работи вечно

Изчакайте 10 секунди и дайте на часовника сигнал за край.

Основната нишка завършва своята работа.

Нишката на часовника приключва работата си.

„Ами ако имаме няколко нишки, тогава Howво?“

„Най-добре е да имате такава променлива за всяка нишка. Най-удобно е да я добавите директно към класа. Можете да добавите булева променлива isRun там. Въпреки това е по-добре да добавите булева променлива isCancel , която става true, ако задачата е отменен."

Код Описание
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");
}
}
}
Класът Clock записва думата «Tick» в конзолата веднъж в секунда, докато isCancel е невярно.

Когато isCancel стане true, методът за изпълнение се прекратява.

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

Thread.sleep(10000);
clock.cancel();
}
Основната нишка стартира дъщерна нишка (часовник), която трябва да работи вечно

Изчакайте 10 секунди и  отменете задачата, като извикате метода за отмяна.

Основната нишка завършва своята работа.

Нишката на часовника приключва работата си.

„Ще го имам предвид. Благодаря, Ели.“