{"id":3642,"date":"2017-02-20T19:19:04","date_gmt":"2017-02-20T17:19:04","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=3642"},"modified":"2017-02-20T19:19:18","modified_gmt":"2017-02-20T17:19:18","slug":"mit-yield-und-onspinwait-auf-rechenzeit-verzichten","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2017\/02\/mit-yield-und-onspinwait-auf-rechenzeit-verzichten\/","title":{"rendered":"Mit yield() und onSpinWait() auf Rechenzeit verzichten"},"content":{"rendered":"<p>Im besten Fall signalisiert ein Ereignis, dass Daten bereit stehen und abgeholt werden k\u00f6nnen. 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:<\/p>\n<pre>while ( ! daten_da )\n\n\u00a0 ;\n\ndatenVearbeiten();<\/pre>\n<p>Dieses aktive Warten, engl. busy waiting, oder auch spinning\u00a0genannt, auf Daten (eng. polling) mithilfe einer spin-loop\u00a0verschwendet so programmiert viel Rechenzeit. Eine L\u00f6sung ist mit dem bekannten sleep(\u2026) eine Zeit von Millisekunden zu schlafen, wobei es schwierig ist, die richtige Anzahl an Schlafsekunden zu ermitteln. Zu kurz geschlafen hei\u00dft: noch einmal weiter pollen; zu lang geschlafen, hei\u00dft: es gibt eine unn\u00f6tige Verz\u00f6gerung.<\/p>\n<p>Die Thread-Klasse bietet zwei weitere Methoden, um kooperative Threads zu programmieren: die Methode yield() und ab Java 9 onSpinWait(). Anders als bei sleep(\u2026) gibt es hier keine Millisekunden anzugeben.<\/p>\n<pre>while ( ! daten_da )\n\n\u00a0 Thread.onSpinWait();\n\ndatenVearbeiten();<\/pre>\n<p>class\u00a0java.lang.Thread<br \/>\nimplements\u00a0Runnable<\/p>\n<ul>\n<li>static void onSpinWait()<br \/>\nSignalisiert 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 \u201eJEP 285: Spin-Wait Hints\u201c.<a href=\"#_ftn1\" name=\"_ftnref1\">[1]<\/a><\/li>\n<li>static voidyield()<br \/>\nDer laufende Thread gibt freiwillig seine Rechenzeit ab, sodass er bez\u00fcglich seiner Priorit\u00e4t wieder in die Thread-Warteschlange des Systems einordnet wird. Einfach ausgedr\u00fcckt, signalisiert yield() der Thread-Verwaltung: \u201eIch setze diese Runde aus und mache weiter, wenn ich das n\u00e4chste Mal dran bin.\u201c Die Methode ist f\u00fcr Implementierungen der JVM nicht verbindlich. Die API-Dokumentation warnt eher von der Methode \u201eIt is rarely appropriate to use this method.\u201d<\/li>\n<\/ul>\n<p><a href=\"#_ftnref1\" name=\"_ftn1\">[1]<\/a> \u00a0\u00a0\u00a0\u00a0\u00a0 http:\/\/openjdk.java.net\/jeps\/285<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Im besten Fall signalisiert ein Ereignis, dass Daten bereit stehen und abgeholt werden k\u00f6nnen. 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 ( ! daten_da ) \u00a0 [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":"","_links_to":"","_links_to_target":""},"categories":[1,11,85],"tags":[],"class_list":["post-3642","post","type-post","status-publish","format-standard","hentry","category-allgemein","category-insel","category-java-9"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3642","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/comments?post=3642"}],"version-history":[{"count":4,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3642\/revisions"}],"predecessor-version":[{"id":3646,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3642\/revisions\/3646"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=3642"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=3642"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=3642"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}