„Здрасти, Амиго!“
„Сега ще ви разкажа малко за методите заспиване, yield и join.“
„Това е скучно. Току-що намерих въпрос за интервю: „Каква е разликата между методите yield (), sleep () и wait ()?“. Можете ли да обясните това?“
„Няма проблем. Първо, това са три напълно различни метода.“
1) sleep(timeout) – спира текущата нишка (на която е извикан sleep) за броя мorсекунди, посочени от параметъра timeout. След това нишката преминава в състояние TIMED_WAITING. Методът може да приключи по-рано, ако е зададен флагът isInterrupted.
Пример | Описание |
---|---|
|
Текущата нишка спира собственото си изпълнение за 500 мorсекунди or 0,5 секунди. |
2) yield() – текущата нишка „пропуска реда си“. Нишката преминава от състояние на изпълнение в състояние на готовност и JVM преминава към следващата нишка. Работните състояния и готовността са подсъстояния на състоянието RUNNABLE .
Пример | Описание |
---|---|
|
Текущата нишка "пропуска реда си" и Java незабавно превключва към следващата нишка. |
3) wait(timeout) – това е version на метода wait (), но с таймаут. „ Методът за изчакване може да бъде извикан само в рамките на синхронизиран блок на mutex обект, заключен от текущата нишка. В противен случай методът хвърля изключение Illegal MonitorState .
„Извикването на този метод води до освобождаване на заключването на обекта mutex, което го прави достъпен за придобиване от друга нишка. Освен това нишката влиза в състояние WAITING (за метода wait() без параметри) or състояние TIMED_WAITING (за изчакване (време за изчакване ) метод)."
Пример | Описание |
---|---|
|
Когато се извика методът за изчакване, текущата нишка освобождава заключването на обекта на монитора и заспива за 500 мorсекунди. Обектът на монитора може да бъде придобит от друга нишка. След 500 мorсекунди нишката ще се събуди и ако мониторът не е зает, нишката ще го придобие и ще продължи да работи. Ако мониторът е заключен от друга нишка, текущата нишка ще премине в състояние БЛОКИРАНО. |
4) присъединяване (изчакване)
„Този метод не беше във вашия въпрос, но е в плана ми за урок, така че ще ви разкажа за него. Когато извикате метода join() or join(timeout), текущата нишка е „прикачена“ към нишката която извика този метод. Текущата нишка заспива и изчаква нишката, към която е присъединена, да завърши (т.е. нишката, чийто метод join() е извикан)."
„Текущата нишка влиза в състояние WAITING за метода join() и състояние TIMED_WAITING за метода join(timeout).“
Пример | Описание |
---|---|
|
Текущата нишка ще се присъедини към нишката workerThread и ще изчака да приключи. Но той ще се „откачи“ след 500 мorсекунди и ще продължи да работи. |
„Изчакването в методите за изчакване (изчакване) и присъединяване (изчакване) означава, че методът заспива и чака нещо, но не по-дълго от времето за изчакване, дадено в мorсекунди. След това се събужда.“
"Изглежда, че единственото общо нещо, което тези методи имат, е времето за изчакване. Те правят напълно различни неща."
— Да, така е.
GO TO FULL VERSION