Кратко въведение в Java Thread.yield ()

1. Общ преглед

В този урок ще изследваме метода yield () в клас Thread .

Ще го сравним с други паралелни идиоми, налични в Java, и в крайна сметка ще проучим практическите приложения на него.

2. Синопсис на добива ()

Както се казва в официалната документация, yield () предоставя механизъм за информиране на „планиращия орган “, че текущата нишка е готова да се откаже от текущата си употреба на процесор, но би искала да бъде насрочена обратно възможно най-скоро.

„Графикът“ е свободен да се придържа или игнорира тази информация и всъщност има различно поведение в зависимост от операционната система.

Следният кодов фрагмент показва две нишки със същия приоритет, даващи след всеки график:

public class ThreadYield { public static void main(String[] args) { Runnable r = () -> { int counter = 0; while (counter < 2) { System.out.println(Thread.currentThread() .getName()); counter++; Thread.yield(); } }; new Thread(r).start(); new Thread(r).start(); } }

Когато се опитаме да стартираме горната програма няколко пъти, получаваме различни резултати; някои от тях са споменати по-долу:

Изпълнение 1:

Thread-0 Thread-1 Thread-1 Thread-0

Изпълнение 2:

Thread-0 Thread-0 Thread-1 Thread-1

Така че, както виждате, поведението на yield () също е недетерминирано и зависи от платформата.

3. Сравнение с други идиоми

Има и други конструкции за въздействие върху относителната прогресия на нишките. Те включват wait () , notify () и notifyAll () като част от Object class, join () като част от Thread class и sleep () като част от Thread class.

Нека да видим как се сравняват с yield () .

3.1. yield () срещу wait ()

  • Докато yield () се извиква в контекста на текущата нишка, wait () може да бъде извикан само при изрично придобита ключалка в синхронизиран блок или метод
  • За разлика от yield () , възможно е wait () да посочи минимален период от време за изчакване преди всеки опит за повторно планиране на нишката
  • С wait () също е възможно да събудите нишката по всяко време чрез извикване на notify () или notifyAll () на съответния обект за заключване

3.2. yield () срещу сън ()

  • Докато yield () може да направи само евристичен опит да спре изпълнението на текущата нишка без гаранция кога ще бъде насрочено обратно, sleep () може да принуди планиращия да спре изпълнението на текущата нишка поне за споменатото време период като негов параметър.

3.3. yield () срещу join ()

  • Текущата нишка може да извика join () на всяка друга нишка, което кара текущата нишка да изчака другата нишка да умре, преди да продължи
  • По желание той може да посочи период от време като свой параметър, който показва максималното време, за което текущата нишка трябва да изчака, преди да се възобнови

4. Употреба за добив ()

Както се казва в официалната документация, рядко е необходимо да се използва yield () и следователно трябва да се избягва, освен ако не е много ясно с целите в светлината на поведението му.

Независимо от това, някои от ползите за yield () включват проектиране на конструкции за контрол на паралелността, подобряване на отзивчивостта на системата в изчислителна тежка програма и т.н.

Тези употреби обаче трябва да бъдат придружени от подробно профилиране и сравнителен анализ, за ​​да се осигури желаният резултат.

5. Заключение

В тази кратка статия обсъдихме метода yield () в класа Thread и видяхме неговото поведение и ограничения чрез фрагмент от код.

Също така проучихме неговото сравнение с други идиоми за съвпадение, налични в Java, и накрая разгледахме някои от случаите на използване, при които yield () може да бъде полезен.

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