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

„Сега ще ви разкажа малко за методите заспиване, 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секунди. След това се събужда.“

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

— Да, така е.