CodeGym /Курсове /Java Multithreading /Други методи на класа Thread (sleep, yield...)

Други методи на класа Thread (sleep, yield...)

Java Multithreading
Ниво, Урок
На разположение

„Здрасти, Амиго!“

„Сега ще ви разкажа малко за методите заспиване, yield и join.“

„Това е скучно. Току-що намерих въпрос за интервю: „Каква е разликата между методите yield (), sleep () и wait ()?“. Можете ли да обясните това?“

„Няма проблем. Първо, това са три напълно различни метода.“

1) sleep(timeout)  – спира текущата нишка (на която е извикан sleep) за броя мorсекунди, посочени от параметъра timeout. След това нишката преминава в състояние TIMED_WAITING. Методът може да приключи по-рано, ако е зададен флагът isInterrupted.

Пример Описание
Thread.sleep(500);
Текущата нишка спира собственото си изпълнение за 500 мorсекунди or 0,5 секунди.

2) yield()  – текущата нишка „пропуска реда си“. Нишката преминава от състояние на изпълнение в състояние на готовност и JVM преминава към следващата нишка. Работните състояния и готовността са подсъстояния на състоянието RUNNABLE .

Пример Описание
Thread.yield();
Текущата нишка "пропуска реда си" и Java незабавно превключва към следващата нишка.

3) wait(timeout)  – това е version на метода wait (), но с таймаут. „ Методът за изчакване може да бъде извикан само в рамките на синхронизиран блок на mutex обект, заключен от текущата нишка. В противен случай методът хвърля изключение Illegal MonitorState .

„Извикването на този метод води до освобождаване на заключването на обекта mutex, което го прави достъпен за придобиване от друга нишка. Освен това нишката влиза в състояние WAITING (за метода wait() без параметри) or състояние TIMED_WAITING (за изчакване (време за изчакване ) метод)."

Пример Описание
Object monitor = getMonitor();
synchronized(monitor)
{
 …
 monitor.wait(500);
 …
}
Когато се извика методът за изчакване, текущата нишка освобождава заключването на обекта на монитора и заспива за 500 мorсекунди. Обектът на монитора може да бъде придобит от друга нишка.
След 500 мorсекунди нишката ще се събуди и ако мониторът не е зает, нишката ще го придобие и ще продължи да работи.
Ако мониторът е заключен от друга нишка, текущата нишка ще премине в състояние БЛОКИРАНО.

4) присъединяване (изчакване)

„Този ​​метод не беше във вашия въпрос, но е в плана ми за урок, така че ще ви разкажа за него. Когато извикате метода join() or join(timeout), текущата нишка е „прикачена“ към нишката която извика този метод. Текущата нишка заспива и изчаква нишката, към която е присъединена, да завърши (т.е. нишката, чийто метод join() е извикан)."

„Текущата нишка влиза в състояние WAITING за метода join() и състояние TIMED_WAITING за метода join(timeout).“

Пример Описание
Thread thread = getWorkThread();
thread.join(500);
Текущата нишка ще се присъедини към нишката workerThread и ще изчака да приключи.
Но той ще се „откачи“ след 500 мorсекунди и ще продължи да работи.

„Изчакването в методите за изчакване (изчакване) и присъединяване (изчакване) означава, че методът заспива и чака нещо, но не по-дълго от времето за изчакване, дадено в мorсекунди. След това се събужда.“

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

— Да, така е.

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