---
title: 'Mit yield() und onSpinWait() auf Rechenzeit verzichten'
url: 'https://tutego.de/blog/javainsel/2017/02/mit-yield-und-onspinwait-auf-rechenzeit-verzichten'
markdown: 'https://tutego.de/blog/javainsel/2017/02/mit-yield-und-onspinwait-auf-rechenzeit-verzichten.md'
date: '2017-02-20'
description: 'Im besten Fall signalisiert ein Ereignis, dass Daten bereit stehen und abgeholt werden können. Doch nicht immer gibt es eine solche API. Dann findet sich oft ein wiederholter Test auf eine Bedingung und wird diese wahr, stehen zum Beispiel Daten zum Abholen bereit. In Code sieht das so aus: while (…'
taxonomy:
  category:
    - Allgemein
    - Insel
    - 'Java 9'
---

# Mit yield() und onSpinWait() auf Rechenzeit verzichten

![Illustration einer tropischen Insel mit Palmen und einem hohen Berg](https://tutego.de/blog/javainsel/user/themes/tutego/images/insel-cover.jpg)# Java Blog für Programmierer

[Java Blog für Programmierer](https://tutego.de/blog/javainsel/)

## Mit yield() und onSpinWait() auf Rechenzeit verzichten

20.02.2017 · [Christian Ullenboom](https://tutego.de/blog/javainsel/author/admin/)

Im besten Fall signalisiert ein Ereignis, dass Daten bereit stehen und abgeholt werden können. Doch nicht immer gibt es eine solche API. Dann findet sich oft ein wiederholter Test auf eine Bedingung und wird diese wahr, stehen zum Beispiel Daten zum Abholen bereit. In Code sieht das so aus:

```java
while ( ! daten_da )

  ;

datenVearbeiten();
```

Dieses aktive Warten, engl. busy waiting, oder auch spinning genannt, auf Daten (eng. polling) mithilfe einer spin-loop verschwendet so programmiert viel Rechenzeit. Eine Lösung ist mit dem bekannten `sleep(…)` eine Zeit von Millisekunden zu schlafen, wobei es schwierig ist, die richtige Anzahl an Schlafsekunden zu ermitteln. Zu kurz geschlafen heißt: noch einmal weiter pollen; zu lang geschlafen, heißt: es gibt eine unnötige Verzögerung.

Die `Thread`-Klasse bietet zwei weitere Methoden, um kooperative Threads zu programmieren: die Methode `yield()` und ab Java 9 `onSpinWait()`. Anders als bei `sleep(…)` gibt es hier keine Millisekunden anzugeben.

```java
while ( ! daten_da )

  Thread.onSpinWait();

datenVearbeiten();
```

class `java.lang.Thread`implements `Runnable`

```java
- static void onSpinWait()
```

```
Signalisiert der Laufzeitumgebung. das der Thread in einer spin-loop auf Daten wartet. Dieser Hinweis kann die JVM an den Prozessor weitegeben und die Laufzeit ist bei typischen Systemen besser als mit yield(). Neu in Java 9 im Zuge der Umsetzung der „JEP 285: Spin-Wait Hints“.[\[1\]](#_ftn1)
```

- `static voidyield()`Der laufende Thread gibt freiwillig seine Rechenzeit ab, sodass er bezüglich seiner Priorität wieder in die Thread-Warteschlange des Systems einordnet wird. Einfach ausgedrückt, signalisiert yield() der Thread-Verwaltung: „Ich setze diese Runde aus und mache weiter, wenn ich das nächste Mal dran bin.“ Die Methode ist für Implementierungen der JVM nicht verbindlich. Die API-Dokumentation warnt eher von der Methode „It is rarely appropriate to use this method.”

[\[1\]](#_ftnref1) <http://openjdk.java.net/jeps/285>

Kategorien: [Allgemein](https://tutego.de/blog/javainsel/category/allgemein/), [Insel](https://tutego.de/blog/javainsel/category/insel/), [Java 9](https://tutego.de/blog/javainsel/category/java-9/)

[← Alle Beiträge](https://tutego.de/blog/javainsel/)

---

## Navigation

- Previous: [System-Logging in Java 9](https://tutego.de/blog/javainsel/2017/02/system-logging-in-java-9.md)
- Next: [Socket-Optionen erfragen](https://tutego.de/blog/javainsel/2017/02/socket-optionen-erfragen.md)
