{"id":4079,"date":"2018-02-22T21:44:14","date_gmt":"2018-02-22T19:44:14","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=4079"},"modified":"2018-02-22T23:40:45","modified_gmt":"2018-02-22T21:40:45","slug":"tor-auf-mit-countdownlatch","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2018\/02\/tor-auf-mit-countdownlatch\/","title":{"rendered":"Tor auf mit CountDownLatch"},"content":{"rendered":"<p>Die Klasse CountDownLatch hilft Threads an einem gewissen Punkt zusammenzukommen und dann weiterzumachen. Das kann ein Thread sein, der auf das Fertigwerden von <em>N<\/em> anderen Threads wartet oder <em>N<\/em> Threads, die ein Signal zum Loslaufen bekommen. CountDownLatch ist mit einem Z\u00e4hler assoziiert, der sich herunterz\u00e4hlen l\u00e4sst. Auf der anderen Seite wartet die andere Partei darauf, dass der Z\u00e4hler 0 wird, um fortzuf\u00fchren. Mit diesem Wissen ergibt auch der Klassenname Sinn: \u201ecount down\u201c hei\u00dft auf deutsch \u201erunterz\u00e4hlen\u201c und \u201elatch\u201c ist das englische Wort f\u00fcr Falle, Riegel, Sperrklinke; nach dem erfolgreichen runterz\u00e4hlen entsperrt die Klinke.<\/p>\n<p>Ein Beispiel. Wir wollen pr\u00fcfen, ob Hosts im Internet erreichbar sind. Der Z\u00e4hler vom CountDownLatch entspricht der Anzahl der zu \u00fcberpr\u00fcfenden Hosts. F\u00fcr jeden Host starten wir einen Thread. Ist der Host erreichbar, wird CountDownLatch mit countDown() herunterz\u00e4hlt. Am Ende waren wir jedoch nicht mit await() ob wir bei 0 angekommen sind \u2013 Hosts k\u00f6nnen nicht erreichbar sein \u2013 sondern wir warten eine gewisse Zeit mit der \u00fcberladenen Methode await(long timeout, TimeUnit unit). Ist der Z\u00e4hler nach der Zeit nicht 0 gibt es keine Ausnahme, sondern wir erfragen den Z\u00e4hler um herauszufinden, wie viele Hosts erreichbar waren.<\/p>\n<pre>List&lt;String&gt; hosts = List.of( \"popel.nase\", \"tutego.de\" );\r\n\r\n<strong>CountDownLatch latch = new CountDownLatch( hosts.size() );<\/strong>\r\n\r\n\r\n\r\nfor ( String host : hosts ) {\r\n\r\n\u00a0 new Thread( () -&gt; {\r\n\r\n\u00a0\u00a0\u00a0 try {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 if ( InetAddress.getByName( host ).isReachable( 900 \/* ms *\/ ) )\r\n\r\n<strong>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 latch.countDown();<\/strong>\r\n\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 catch ( IOException e ) { \/* ignore *\/ }\r\n\r\n\u00a0 } ).start();\r\n\r\n}\r\n\r\n\r\n\r\ntry {\r\n\r\n\u00a0 if ( <strong>latch.await( 1, TimeUnit.SECONDS )<\/strong> )\r\n\r\n\u00a0\u00a0\u00a0 System.out.println( \"Alle Hosts erreicht\" );\r\n\r\n\r\n\r\n\u00a0\u00a0System.out.printf( \"%d von %d Hosts nicht erreicht\", <strong>latch.getCount()<\/strong>, hosts.size() );\r\n\r\n}\r\n\r\ncatch ( InterruptedException e ) {\r\n\r\n\u00a0 e.printStackTrace();\r\n\r\n}<\/pre>\n<p>Der CountDownLatch hat nur eine Methode zum Herunterz\u00e4hlen, nicht zum wieder erh\u00f6hen. Damit ist klar, dass sich ein heruntergez\u00e4hltes Objekt nicht mehr verwenden kann.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Klasse CountDownLatch hilft Threads an einem gewissen Punkt zusammenzukommen und dann weiterzumachen. Das kann ein Thread sein, der auf das Fertigwerden von N anderen Threads wartet oder N Threads, die ein Signal zum Loslaufen bekommen. CountDownLatch ist mit einem Z\u00e4hler assoziiert, der sich herunterz\u00e4hlen l\u00e4sst. Auf der anderen Seite wartet die andere Partei darauf, [&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":[11],"tags":[],"class_list":["post-4079","post","type-post","status-publish","format-standard","hentry","category-insel"],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4079","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=4079"}],"version-history":[{"count":2,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4079\/revisions"}],"predecessor-version":[{"id":4081,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4079\/revisions\/4081"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4079"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4079"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4079"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}