„Здравей, Амиго!

"Всичко ново е просто нещо старо, което сме забравor. Днес ще говоря за спиране на нишки. Надявам се, че вече сте забравor How работи методът interrupt()."

— Да, Ели, съвсем го забравих.

"Страхотно. Тогава ще ти напомня."

"В Java, ако някой иска да спре работеща нишка, той може да сигнализира това на нишката. За да направите това, трябва да настроите скритата променлива isInterrupted на обекта Thread на true."

„Всяка нишка има метод interrupt(), който се използва за задаване на този флаг. Когато методът interrupt () се извика, променливата isInterrupted вътре в обекта Thread е зададена на true.“

„И когато методът Thread.sleep() or join() се извика на нишка, методът проверява дали флагът isInterrupted е зададен за текущата нишка. Ако този флаг е зададен (променливата isInterrupted е равна на true), тогава методите хвърлете InterruptedException ."

„Ето, ще ви припомня един стар пример:“

Код Описание
class Clock implements Runnable
{
public void run()
{
Thread current = Thread.currentThread();

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tik");
}
}
}
Методът run на часовника получава обекта Thread за текущата нишка.

Класът Clock записва думата "Tick" в конзолата веднъж в секунда, докато променливата isInterrupt на текущата нишка е false.

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

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

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

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

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

Нишката на часовника завършва работата си.

„Тук използваме метода на заспиване като част от безкраен цикъл в метода за изпълнение . В цикъла променливата isInterrupt се проверява автоматично. Ако нишка извика метода на заспиване , методът първо проверява дали isInterrupt е вярно за тази нишка ( такъв, който извика метода на заспиване). Ако е вярно, тогава методът няма да заспи. Вместо това хвърля InterruptedException . "

„Но в този пример ние постоянно проверяваме променливата isInterrupted в conditionто на цикъла.“

„Спомням си, че имаше някои причини, поради които не можехме да използваме този подход. Бихте ли ми напомнor?“

" Първо , методът за изпълнение не винаги има цикъл. Методът може просто да се състои от няколко дузини извиквания към други методи. В този случай ще трябва да добавите проверка isInterrupted преди всяко извикване на метод."

" Второ , някои методи, включващи много различни действия, може да отнеме много време за изпълнение."

" Трето , хвърлянето на изключение не замества проверката isInterrupted. Това е просто удобно допълнение. Изхвърленото изключение ви позволява бързо да отвиете стека за извикване обратно към самия метод за изпълнение ."

" Четвърто , методът на заспиване се използва много. Оказва се, че този полезен метод е подсилен от имплицитна проверка, която е не по-малко полезна.  Сякаш никой не е добавил специално проверката, но ето я.  Това е супер ценно, когато използвате codeа на някой друг и не можете сами да добавите чека."

" Пето , допълнителната проверка не влошава производителността. Извикването на метода на заспиване означава, че нишката не трябва да прави нищо (освен заспиване), така че допълнителната работа не притеснява никого."

— Точно това казахте преди.

"А Howво ще кажете за вашето изказване, « Никой не може да гарантира, че една нишка ще бъде спряна. Само една нишка може да спре сама себе си. » Можете ли да обясните това?"

"Сигурен."

„Преди това, в ранните версии на Java, нишките имаха метод stop(). И когато го извикахте, JVM всъщност спря нишката. Но ако нишката правеше нещо извън JVM (например, писане във файл or извикване Функции на ОС), когато е било прекъснато по този начин, прекъсването е причинило много проблеми, като например незатворени файлове, неосвободени системни ресурси и т.н."

„Общо събрание на създателите на Java реши да премахне метода за принудително спиране на нишки. Сега всичко, което можем да направим, е да зададем определен флаг (isInterrupted) и да се надяваме, че codeът на нишката е написан правилно, така че този флаг да бъде обработен. Този флаг е като знак, който казва: "Нишката, спри, моля. Много е важно!". Но дали ще спре or не, си е негова работа."

„Но Howво да кажем за InterruptedException?“

„Какво ще стане, ако codeът, изпълняван в тази нишка, има куп блокове try-catch? Дори ако някъде се появи InterruptedException, определено няма гаранция, че някой try-catch няма да го улови и да забрави за него. Така че няма гаранции, че нишката ще спре."

„Друго нещо е, че нишките вече се считат за програмиране на доста ниско ниво. Но ще ви разкажа за това следващия път.“

— Ти не си Ели — ти си Шехерезада!

„И така, Амиго! Всичко ясно ли е в настоящия урок?“

— Да.

"Добре."