{"id":4082,"date":"2018-02-24T13:25:38","date_gmt":"2018-02-24T11:25:38","guid":{"rendered":"http:\/\/www.tutego.de\/blog\/javainsel\/?p=4082"},"modified":"2018-02-24T20:29:36","modified_gmt":"2018-02-24T18:29:36","slug":"callable-oder-runnable-mit-futuretask-ummanteln","status":"publish","type":"post","link":"https:\/\/www.tutego.de\/blog\/javainsel\/2018\/02\/callable-oder-runnable-mit-futuretask-ummanteln\/","title":{"rendered":"Callable oder Runnable mit FutureTask ummanteln"},"content":{"rendered":"<p>Die Klasse java.util.concurrent.FutureTask implementiert Future, Runnable und RunnableFuture und wird intern von der Java-Bibliothek verwendet, wenn wir mit submit(\u2026) etwas beim ExecutorService absetzen. Auch wir k\u00f6nnen den Typ direkt als Wrapper um ein Callable oder Runnable nutzen, denn es gibt praktische Callback-Methoden, die wir \u00fcberschreiben k\u00f6nnen, etwa done(), wenn eine Berechung fertig ist.<\/p>\n<p>Dazu ein Beispiel: Ein Callable liefert den Namen des Benutzers. Ein FutureTask legt sich um dieses Callable und bekommt mit, wann das Callable fertig ist und modifiziert dann den Benutzernamen und gibt weiterhin eine Meldung aus.<\/p>\n<pre>Callable&lt;String&gt; username = () -&gt; System.getProperty( \"user.name\" );\r\n\r\n<strong>FutureTask&lt;String&gt; wrappedUsername = new FutureTask&lt;&gt;( username )<\/strong> {\r\n\r\n\u00a0 @Override\r\n\r\n\u00a0 protected <strong>void done()<\/strong> {\r\n\r\n\u00a0\u00a0\u00a0 try {\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.printf( \"done: isDone=%s, isCancelled=%s%n\", <strong>isDone()<\/strong>, <strong>isCancelled()<\/strong> );\r\n\r\n\u00a0\u00a0\u00a0\u00a0\u00a0 System.out.println( \"done: get=\" + <strong>get()<\/strong> );\r\n\r\n\u00a0\u00a0\u00a0 }\r\n\r\n\u00a0\u00a0\u00a0 catch ( InterruptedException | ExecutionException e ) { \/* Ignore *\/ }\r\n\r\n\u00a0 }\r\n\r\n\u00a0 @Override\r\n\r\n\u00a0 protected <strong>void set( String v )<\/strong> {\r\n\r\n\u00a0\u00a0\u00a0 System.out.println( \"set: \" + v );\r\n\r\n\u00a0\u00a0\u00a0 <strong>super.set<\/strong>( v.toUpperCase() );\r\n\r\n\u00a0 }\r\n\r\n};\r\n\r\nExecutorService scheduler = Executors.newCachedThreadPool();\r\n\r\nscheduler.submit( wrappedUsername );\r\n\r\nSystem.out.println( \"main: \" + <strong>wrappedUsername.get()<\/strong> );\r\n\r\nscheduler.shutdown();<\/pre>\n<p>Wichtig in der Nutzung ist, nicht die R\u00fcckgabe vom submit(\u2026) auszuwerten, was wir normalerweise machen, sondern das \u00fcbergebene FutureTask zu erfragen.<\/p>\n<p>Die Ausgaben vom Programm sind oft ein wenig durcheinander:<\/p>\n<pre>set: Christian\r\ndone: isDone=true, isCancelled=false\r\ndone: get=CHRISTIAN\r\nmain: CHRISTIAN<\/pre>\n<p>Die Reihenfolge in den Aufrufen ist immer so: Der FutureTask stellt die Fertigstellung vom Callable fest und ruft set(\u2026) auf. Anschlie\u00dfend done().<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die Klasse java.util.concurrent.FutureTask implementiert Future, Runnable und RunnableFuture und wird intern von der Java-Bibliothek verwendet, wenn wir mit submit(\u2026) etwas beim ExecutorService absetzen. Auch wir k\u00f6nnen den Typ direkt als Wrapper um ein Callable oder Runnable nutzen, denn es gibt praktische Callback-Methoden, die wir \u00fcberschreiben k\u00f6nnen, etwa done(), wenn eine Berechung fertig ist. Dazu ein [&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-4082","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\/4082","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=4082"}],"version-history":[{"count":2,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4082\/revisions"}],"predecessor-version":[{"id":4084,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/posts\/4082\/revisions\/4084"}],"wp:attachment":[{"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/media?parent=4082"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/categories?post=4082"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.tutego.de\/blog\/javainsel\/wp-json\/wp\/v2\/tags?post=4082"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}