{"id":29078,"date":"2022-04-20T17:09:13","date_gmt":"2022-04-20T15:09:13","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=29078"},"modified":"2024-11-27T15:00:56","modified_gmt":"2024-11-27T14:00:56","slug":"delayqueue-java","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/delayqueue-java\/","title":{"rendered":"DelayQueue in Java (mit Beispiel)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In diesem und den n\u00e4chsten Teilen dieser Tutorialserie geht es um Queues f\u00fcr spezielle Einsatzzwecke. Wir beginnen mit der <code>DelayQueue<\/code>, einer Queue, die die Elemente nach Ablaufzeit sortiert herausgibt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier befinden wir uns in der Klassenhierarchie:<\/p>\n\n\n\n<div class=\"wp-block-image\"><figure class=\"aligncenter size-full\"><img decoding=\"async\" width=\"1600\" height=\"1000\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/DelayQueue-class-hierarchy.png\" alt=\"DelayQueue in der Klassenhierarchie\" class=\"wp-image-29080\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/DelayQueue-class-hierarchy.png 1600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/DelayQueue-class-hierarchy-224x140.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/DelayQueue-class-hierarchy-336x210.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/DelayQueue-class-hierarchy-504x315.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/DelayQueue-class-hierarchy-672x420.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/DelayQueue-class-hierarchy-400x250.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/DelayQueue-class-hierarchy-600x375.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/DelayQueue-class-hierarchy-800x500.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/DelayQueue-class-hierarchy-944x590.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/DelayQueue-class-hierarchy-1200x750.png 1200w\" sizes=\"(max-width: 1600px) 100vw, 1600px\" \/><figcaption>DelayQueue in der Klassenhierarchie<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"delayqueue-eigenschaften\">DelayQueue Eigenschaften<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Klasse <code>java.util.concurrent.DelayQueue<\/code> ist \u2013 genau wie die <a href=\"\/de\/algorithmen\/priorityqueue-java\/\">PriorityQueue<\/a>, die sie intern verwendet \u2013 keine FIFO-Queue. Es wird <em>nicht<\/em> das Element entnommen, das sich am l\u00e4ngsten in der Queue befindet. Stattdessen wird ein Element dann entnommen, wenn eine diesem Element zugeordnete Wartezeit (\"delay\") abgelaufen ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dazu m\u00fcssen die Elemente das Interface <code>java.util.concurrent.Delayed<\/code> und dessen <code>getDelay\u200b()<\/code>-Methode implementieren. Diese Methode liefert bei jeden Aufruf die restliche Wartezeit zur\u00fcck, die noch ablaufen muss, bis das Element aus der Queue entnommen werden darf.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>DelayQueue<\/code> ist blockierend, aber unbounded, kann also beliebig viele Elemente aufnehmen und blockiert nur bei der Entnahme (bis die Wartezeit abgelaufen ist), nicht beim Einf\u00fcgen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Threadsicherheit wird durch pessimistisches Locking \u00fcber ein einzelnes <code>ReentrantLock<\/code> sichergestellt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Eigenschaften im Detail:<\/p>\n\n\n\n<figure class=\"wp-block-table is-style-stripes less-line-height\"><table class=\"has-fixed-layout\"><thead><tr><th class=\"has-text-align-center\" data-align=\"center\">Unterliegende Datenstruktur<\/th><th class=\"has-text-align-center\" data-align=\"center\">Thread-safe?<\/th><th class=\"has-text-align-center\" data-align=\"center\">Blocking\/<br>Non-blocking<\/th><th class=\"has-text-align-center\" data-align=\"center\">Fairness<br>Policy<\/th><th class=\"has-text-align-center\" data-align=\"center\">Bounded\/<br>Unbounded<\/th><th class=\"has-text-align-center\" data-align=\"center\">Iterator Type<\/th><\/tr><\/thead><tbody><tr><td class=\"has-text-align-center\" data-align=\"center\">Priority Queue<\/td><td class=\"has-text-align-center\" data-align=\"center\">Ja<br><span style=\"font-size:90%\">(pessimistisches Locking mit einem Lock)<\/span><\/td><td class=\"has-text-align-center\" data-align=\"center\">Blocking<br><span style=\"font-size:90%\">(nur dequeue)<\/span><\/td><td class=\"has-text-align-center\" data-align=\"center\">Nicht verf\u00fcgbar<\/td><td class=\"has-text-align-center\" data-align=\"center\">Unbounded<\/td><td class=\"has-text-align-center\" data-align=\"center\">Weakly consistent\u00b9<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"hc-footnote wp-block-paragraph\">\u00b9 Weakly consistent: Alle Elemente, die zum Zeitpunkt der Erzeugung des Interators in der Queue liegen, werden vom Iterator genau einmal durchlaufen. \u00c4nderungen, die danach erfolgen, k\u00f6nnen \u2013 m\u00fcssen aber nicht \u2013 durch den Iterator ber\u00fccksichtigt werden.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"einsatzempfehlung\">Einsatzempfehlung<\/h3>\n\n\n\n<p class=\"wp-block-paragraph\">Ich habe die <code>DelayQueue<\/code> noch nie ben\u00f6tigt und kann sie f\u00fcr keinen mir bekannten, sinnvollen Einsatzzweck empfehlen. Sie wird im JDK nur ein einziges Mal genutzt (in einer alten Swing-Klasse, die mit einem <code>ScheduledExecutorService<\/code> wahrscheinlich eleganter h\u00e4tte implementiert werden k\u00f6nnen). Von daher ist nicht ausgeschlossen, dass sie unentdeckte Fehler enth\u00e4lt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"delayqueue-beispiel\">DelayQueue Beispiel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In folgendem Beispiel (\u2192 <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/queue\/DelayQueueExample.java\" target=\"_blank\">Code auf GitHub<\/a>) wird eine <code>DelayQueue<\/code> mit Instanzen der Klasse <code>DelayedElement<\/code> gef\u00fcllt, welche eine Zufallszahl enthalten sowie ein zuf\u00e4lliges initiales Delay zwischen 100 und 1.000 ms. Danach wird so oft <code>poll()<\/code> aufgerufen, bis die Queue wieder leer ist.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DelayQueueExample<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <\/span>{\n    BlockingQueue&lt;DelayedElement&lt;Integer&gt;&gt; queue = <span class=\"hljs-keyword\">new<\/span> DelayQueue&lt;&gt;();\n    ThreadLocalRandom random = ThreadLocalRandom.current();\n    <span class=\"hljs-keyword\">long<\/span> startTime = System.currentTimeMillis();\n\n    <span class=\"hljs-comment\">\/\/ Enqueue random numbers with random initial delays<\/span>\n    <span class=\"hljs-keyword\">for<\/span> (<span class=\"hljs-keyword\">int<\/span> i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">7<\/span>; i++) {\n      <span class=\"hljs-keyword\">int<\/span> randomNumber = random.nextInt(<span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">100<\/span>);\n      <span class=\"hljs-keyword\">int<\/span> initialDelayMillis = random.nextInt(<span class=\"hljs-number\">100<\/span>, <span class=\"hljs-number\">1000<\/span>);\n      DelayedElement&lt;Integer&gt; element = \n          <span class=\"hljs-keyword\">new<\/span> DelayedElement&lt;&gt;(randomNumber, initialDelayMillis);\n      queue.offer(element);\n      System.out.printf(\n          <span class=\"hljs-string\">\"&#091;%3dms] queue.offer(%s)   --&gt; queue = %s%n\"<\/span>,\n          System.currentTimeMillis() - startTime, element, queue);\n    }\n\n    <span class=\"hljs-comment\">\/\/ Dequeue all elements<\/span>\n    <span class=\"hljs-keyword\">while<\/span> (!queue.isEmpty()) {\n      <span class=\"hljs-keyword\">try<\/span> {\n        DelayedElement&lt;Integer&gt; element = queue.take();\n        System.out.printf(\n            <span class=\"hljs-string\">\"&#091;%3dms] queue.poll() = %s --&gt; queue = %s%n\"<\/span>,\n            System.currentTimeMillis() - startTime, element, queue);\n      } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n        Thread.currentThread().interrupt();\n      }\n    }\n  }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Und hier die zugeh\u00f6rige Klasse <code>DelayedElement<\/code> (\u2192 <a href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/queue\/DelayedElement.java\" target=\"_blank\" rel=\"noopener\">Code auf GitHub<\/a>). Die Sortierung ist \u2013 um den Code nicht noch l\u00e4nger zu machen \u2013 nicht stabil. D. h. wenn zwei Elemente mit derselben Wartezeit in die Queue gestellt werden, werden sie in zuf\u00e4lliger Reihenfolge wieder entnommen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">DelayedElement<\/span>&lt;<span class=\"hljs-title\">E<\/span> <span class=\"hljs-keyword\">extends<\/span> <span class=\"hljs-title\">Comparable<\/span>&lt;<span class=\"hljs-title\">E<\/span>&gt;&gt; <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Delayed<\/span> <\/span>{\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> E e;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">long<\/span> initialDelayMillis;\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">long<\/span> expiration;\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-title\">DelayedElement<\/span><span class=\"hljs-params\">(E e, <span class=\"hljs-keyword\">long<\/span> initialDelayMillis)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">this<\/span>.e = e;\n    <span class=\"hljs-keyword\">this<\/span>.initialDelayMillis = initialDelayMillis;\n    <span class=\"hljs-keyword\">this<\/span>.expiration = System.currentTimeMillis() + initialDelayMillis;\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">long<\/span> <span class=\"hljs-title\">getDelay<\/span><span class=\"hljs-params\">(TimeUnit unit)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">long<\/span> remainingDelayMillis = expiration - System.currentTimeMillis();\n    <span class=\"hljs-keyword\">return<\/span> unit.convert(remainingDelayMillis, TimeUnit.MILLISECONDS);\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">int<\/span> <span class=\"hljs-title\">compareTo<\/span><span class=\"hljs-params\">(Delayed o)<\/span> <\/span>{\n    DelayedElement&lt;?&gt; other = (DelayedElement&lt;?&gt;) o;\n    <span class=\"hljs-keyword\">return<\/span> Long.compare(expiration, other.expiration);\n  }\n\n  <span class=\"hljs-meta\">@Override<\/span>\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> String <span class=\"hljs-title\">toString<\/span><span class=\"hljs-params\">()<\/span> <\/span>{\n    <span class=\"hljs-keyword\">return<\/span> <span class=\"hljs-string\">\"{%s, %dms}\"<\/span>.formatted(e, initialDelayMillis);\n  }\n}\n<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Java<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">java<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"wp-block-paragraph\">Hier eine beispielhafte Ausgabe des Programms. Es ist gut zu sehen, wie die Queue zwar nicht sortiert ist\u00b9, das Element mit der k\u00fcrzesten Wartezeit sich jedoch immer vorne (links) befindet und dass die Elemente (ungef\u00e4hr) nach Ablauf ihrer jeweiligen Wartezeit entnommen werden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">&#091;  1ms] queue.offer({19, 713ms})   --&gt; queue = &#091;{19, 713ms}]\n&#091; 28ms] queue.offer({15, 643ms})   --&gt; queue = &#091;{15, 643ms}, {19, 713ms}]\n&#091; 29ms] queue.offer({35, 253ms})   --&gt; queue = &#091;{35, 253ms}, {19, 713ms}, {15, 643ms}]\n&#091; 29ms] queue.offer({11, 781ms})   --&gt; queue = &#091;{35, 253ms}, {19, 713ms}, {15, 643ms}, {11, 781ms}]\n&#091; 29ms] queue.offer({17, 844ms})   --&gt; queue = &#091;{35, 253ms}, {19, 713ms}, {15, 643ms}, {11, 781ms}, {17, 844ms}]\n&#091; 29ms] queue.offer({40, 490ms})   --&gt; queue = &#091;{35, 253ms}, {19, 713ms}, {40, 490ms}, {11, 781ms}, {17, 844ms}, {15, 643ms}]\n&#091; 30ms] queue.offer({39, 119ms})   --&gt; queue = &#091;{39, 119ms}, {19, 713ms}, {35, 253ms}, {11, 781ms}, {17, 844ms}, {15, 643ms}, {40, 490ms}]\n&#091;151ms] queue.poll() = {39, 119ms} --&gt; queue = &#091;{35, 253ms}, {19, 713ms}, {40, 490ms}, {11, 781ms}, {17, 844ms}, {15, 643ms}]\n&#091;283ms] queue.poll() = {35, 253ms} --&gt; queue = &#091;{40, 490ms}, {19, 713ms}, {15, 643ms}, {11, 781ms}, {17, 844ms}]\n&#091;520ms] queue.poll() = {40, 490ms} --&gt; queue = &#091;{15, 643ms}, {19, 713ms}, {17, 844ms}, {11, 781ms}]\n&#091;673ms] queue.poll() = {15, 643ms} --&gt; queue = &#091;{19, 713ms}, {11, 781ms}, {17, 844ms}]\n&#091;716ms] queue.poll() = {19, 713ms} --&gt; queue = &#091;{11, 781ms}, {17, 844ms}]\n&#091;811ms] queue.poll() = {11, 781ms} --&gt; queue = &#091;{17, 844ms}]\n&#091;874ms] queue.poll() = {17, 844ms} --&gt; queue = &#091;]<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">Klartext<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">plaintext<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p class=\"hc-footnote wp-block-paragraph\">\u00b9 Tats\u00e4chlich sieht man die Reihenfolge der Elemente in der Array-Repr\u00e4sentation des Min-Heaps.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"zusammenfassung-und-ausblick\">Zusammenfassung und Ausblick<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">In diesem Artikel hast du alles \u00fcber die <code>DelayQueue<\/code>, ihre Eigenschaften und ihre Verwendung erfahren.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im n\u00e4chsten Teil dieser Serie stelle ich dir weitere Spezialqueue vor \u2013 eine die niemals Elemente enth\u00e4lt: die <a href=\"\/de\/algorithmen\/synchronousqueue-java\/\">SynchronousQueue<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wenn du noch Fragen hast, stelle sie gerne \u00fcber die Kommentar-Funktion. M\u00f6chtest du \u00fcber neue Tutorials und Artikel informiert werden? Dann <a href=\"#\" data-formkit-toggle=\"d8ee997126\">klicke hier<\/a>, um dich f\u00fcr den HappyCoders.eu-Newsletter anzumelden.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Wie benutzt man die Java DelayQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?<\/p>\n","protected":false},"author":1,"featured_media":29397,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Wie benutzt man die Java DelayQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?","_seopress_robots_index":"","_seopress_robots_follow":"","_seopress_robots_imageindex":"","_seopress_robots_snippet":"","_seopress_robots_primary_cat":"none","_seopress_robots_breadcrumbs":"","_seopress_robots_freeze_modified_date":"","_seopress_robots_custom_modified_date":"","_seopress_robots_canonical":"","_seopress_social_fb_title":"","_seopress_social_fb_desc":"","_seopress_social_fb_img":"","_seopress_social_fb_img_attachment_id":0,"_seopress_social_fb_img_width":0,"_seopress_social_fb_img_height":0,"_seopress_social_twitter_title":"","_seopress_social_twitter_desc":"","_seopress_social_twitter_img":"","_seopress_social_twitter_img_attachment_id":0,"_seopress_social_twitter_img_width":0,"_seopress_social_twitter_img_height":0,"_seopress_redirections_value":"","_seopress_redirections_enabled":"","_seopress_redirections_enabled_regex":"","_seopress_redirections_logged_status":"both","_seopress_redirections_param":"","_seopress_redirections_type":301,"_seopress_analysis_target_kw":"DelayQueue","_seopress_news_disabled":"","_seopress_video_disabled":"","_seopress_video":[],"_seopress_pro_schemas_manual":[{"_seopress_pro_rich_snippets_type":"none"}],"_seopress_pro_rich_snippets_disable_all":"","_seopress_pro_rich_snippets_disable":[],"_seopress_pro_schemas":[],"_uag_custom_page_level_css":"","_wp_convertkit_post_meta":{"form":"-1","landing_page":"","tag":"0","restrict_content":"0"},"_metis_text_type":"standard","_metis_text_length":6910,"_post_count":0,"footnotes":""},"categories":[127],"tags":[192],"class_list":["post-29078","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algorithmen","tag-datenstrukturen-queue"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/night-view-1277021-1770x986-1.jpg",1770,986,false]},"uagb_author_info":{"display_name":"Sven Woltmann","author_link":"https:\/\/www.happycoders.eu\/de\/author\/sven\/"},"uagb_comment_info":0,"uagb_excerpt":"Wie benutzt man die Java DelayQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?","public_identification_id":"3e40431e6bba4ab38afc1345fd3e9629","private_identification_id":"bd09092bb79f4ec68d14a2a374b31dfb","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29078","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/comments?post=29078"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29078\/revisions"}],"predecessor-version":[{"id":41687,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29078\/revisions\/41687"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/29397"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=29078"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=29078"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=29078"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}