CodeGym /Java курс /Модул 2: Java Core /Спиране на нишки: официалната версия

Спиране на нишки: официалната версия

Модул 2: Java Core
Ниво , Урок
На разположение

„Здравей, Амиго! Трябва да признаеш, че идеята за отмяна на Ели беше брилянтна.“

— Да.

„Всъщност нещо подобно съществува в класа Thread . Само че променливата не се нарича isCancel . Тя се нарича isInterrupt . И методът, използван за спиране на нишката, не е cancel() . Това е interrupt() .“

"Наистина ли?"

„Да. Вижте го:“

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

while (!current.isInterrupted())
{
Thread.sleep(1000);
System.out.println("Tick");
}
}
}
Тъй като няколко нишки могат да извикат метода за изпълнение на един и същ обект Clock, ние получаваме обект 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 секунди и  отменете задачата, като извикате метода за прекъсване .

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

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

Освен това методът на заспиване , който хората толкова обичат да използват в безкрайни цикли в метода run , автоматично проверява променливата isInterrupt . Ако нишка извика метода на заспиване , методът първо проверява дали isInterrupt е вярно за тази нишка. Ако е вярно, методът няма да заспи. Вместо това хвърля изключение InterruptedException .

"Защо да хвърляте изключение? Не би ли било по-добре просто да поставите isInterrupted() instead of isCancel() в цикъл?"

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

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

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

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

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

— Това са сериозни аргументи.

„И накрая , има следното: Вашият метод за изпълнение може да извика нечий друг code – code, до който нямате достъп (изходен code и/or права за промяна на codeа). Може да няма проверки isInterrupted и може да използва " опитайте ... улов (Изключение e) " за улавяне на всички изключения."

Никой не може да гарантира, че дадена нишка ще бъде спряна. Само една нишка може да спре сама себе си.

Коментари
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION