{"id":3752,"date":"2017-02-25T13:18:50","date_gmt":"2017-02-25T11:18:50","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=3752"},"modified":"2017-02-25T13:18:51","modified_gmt":"2017-02-25T11:18:51","slug":"prozess-status-erfragen-und-das-ende-einleiten","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2017\/02\/prozess-status-erfragen-und-das-ende-einleiten\/","title":{"rendered":"Prozess-Status erfragen und das Ende einleiten"},"content":{"rendered":"<p>Mit Methoden von Process l\u00e4sst sich der Status des externen Programms erfragen und ver\u00e4ndern. Die Methode waitFor(\u2026) l\u00e4sst den eigenen Thread so lange warten, bis das externe Programm zu Ende ist, oder l\u00f6st eine InterruptedException aus, wenn das gestartete Programm unterbrochen wurde. Der R\u00fcckgabewert von waitFor() ist der R\u00fcckgabecode des externen Programms, eine zweite Variante von waitFor(\u2026) wartet eine gegebene Zeit. Wurde das Programm schon beendet, liefert auch exitValue() den R\u00fcckgabewert. Soll das externe Programm (vorzeitig) beendet werden, l\u00e4sst sich die Methode destroyXXX() verwenden; das eigene Java-Programm kann nicht beendet werden.<\/p>\n<p>abstract\u00a0class\u00a0java.lang.Process<\/p>\n<ul>\n<li>abstractintexitValue()<br \/>\nWenn das externe Programm beendet wurde, liefert exitValue() die R\u00fcckgabe des gestarteten Programms. Ist die R\u00fcckgabe 0, deutet das auf ein normales Ende hin. L\u00e4uft das Programm noch, gibt es eine IllegalThreadStateException.<\/li>\n<li>booleanisAlive()<br \/>\nLebt der von der JVM gestartete Unterprozess noch? Ruft intern exitValue() auf und pr\u00fcft auf IllegalThreadStateException.<\/li>\n<li>abstractvoiddestroy()<br \/>\nBeendet das externe Programm.<\/li>\n<li>ProcessdestroyForcibly()<br \/>\nStandardm\u00e4\u00dfig wie destroy(), sollte aber von Unterklassen anders implementiert werden. Das brutale Beenden dauert etwas, sodass isAlive() noch eine kurze Zeit true zur\u00fcckgeben kann.<\/li>\n<li>boolean supportsNormalTermination()<br \/>\nLiefert true, wenn das Programm mit destroy() ohne Probleme beendet werden kann. Unterklassen m\u00fcssen die Methode \u00fcberschreiben, sie l\u00f6st standardm\u00e4\u00dfig eine UnsupportedOperationException Neue Methode in Java 9.<\/li>\n<li>abstractvoidwaitFor()throwsInterruptedException<br \/>\nWartet auf das Ende des externen Programms (ist es schon beendet, muss nicht gewartet werden), sonst blockiert die Methode, und liefert dann abschlie\u00dfend den exitValue().<\/li>\n<li>booleanwaitFor(longtimeout,TimeUnitunit)throwsInterruptedException<br \/>\nWartet die angegebene Zeit auf das Ende des gestarteten Programms. Wurde das externe Programm schon beendet, kehrt die Methode sofort zur\u00fcck und liefert true; den Exit-Code liefert exitValue() weil hier, anders als bei waitFor() der R\u00fcckgabecode ein boolean L\u00e4uft das Programm noch, und ist es nicht nach timeout Zeiteinheiten beendet, kehrt die Methode mit false zur\u00fcck. Die R\u00fcckgabe ist true, wenn das gestartete Programm in dem Zeitfenster beendet wurde. Hinweis: Die Methode bricht das externe Programm nicht ab, wenn es nach \u00dcberschreiten der Zeit noch l\u00e4uft. Diese Logik muss ein Programmierer \u00fcbernehmen und if ( ! waitFor(\u2026) ) mit destroy() kombinieren.<\/li>\n<li>CompletableFuture&lt;Process&gt; onExit()<br \/>\nKehrt nicht-blockierend direkt zur\u00fcck und erlaubt sp\u00e4ter \u00fcber das CompletableFuture Zugriff auf den Process. CompletableFuture erm\u00f6glicht die einfache Verkettung der Art onExit().thenApply( \u2026 ) oder process.onExit().whenComplete( (p, ex) -&gt; System.out.printf(&#8222;Prozess %d beendet%n&#8220;, p.getPid())). Neu in Java 9.<\/li>\n<\/ul>\n","protected":false},"excerpt":{"rendered":"<p>Mit Methoden von Process l\u00e4sst sich der Status des externen Programms erfragen und ver\u00e4ndern. Die Methode waitFor(\u2026) l\u00e4sst den eigenen Thread so lange warten, bis das externe Programm zu Ende ist, oder l\u00f6st eine InterruptedException aus, wenn das gestartete Programm unterbrochen wurde. Der R\u00fcckgabewert von waitFor() ist der R\u00fcckgabecode des externen Programms, eine zweite Variante [&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-3752","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\/3752","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=3752"}],"version-history":[{"count":1,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3752\/revisions"}],"predecessor-version":[{"id":3753,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/3752\/revisions\/3753"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=3752"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=3752"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=3752"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}