{"id":29096,"date":"2022-04-20T17:08:01","date_gmt":"2022-04-20T15:08:01","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=29096"},"modified":"2024-11-27T15:10:05","modified_gmt":"2024-11-27T14:10:05","slug":"priorityblockingqueue-java","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/priorityblockingqueue-java\/","title":{"rendered":"PriorityBlockingQueue in Java (mit Beispiel)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In diesem Artikel erf\u00e4hrst du wie die <code>PriorityBlockingQueue<\/code> funktioniert und welche Eigenschaften sie hat. Anhand eines Beispiels siehst du, wie man sie einsetzt.<\/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\/PriorityBlockingQueue-class-hierarchy.png\" alt=\"PriorityBlockingQueue in der Klassenhierarchie\" class=\"wp-image-29098\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityBlockingQueue-class-hierarchy.png 1600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityBlockingQueue-class-hierarchy-224x140.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityBlockingQueue-class-hierarchy-336x210.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityBlockingQueue-class-hierarchy-504x315.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityBlockingQueue-class-hierarchy-672x420.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityBlockingQueue-class-hierarchy-400x250.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityBlockingQueue-class-hierarchy-600x375.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityBlockingQueue-class-hierarchy-800x500.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityBlockingQueue-class-hierarchy-944x590.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/PriorityBlockingQueue-class-hierarchy-1200x750.png 1200w\" sizes=\"(max-width: 1600px) 100vw, 1600px\" \/><figcaption>PriorityBlockingQueue in der Klassenhierarchie<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"priorityblockingqueue-eigenschaften\">PriorityBlockingQueue Eigenschaften<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bei der <code>java.util.concurrent.PriorityBlockingQueue<\/code> handelt es sich um eine threadsichere und blockierende Variante der <a href=\"\/de\/algorithmen\/priorityqueue-java\/\">PriorityQueue<\/a>. In dem verlinkten Artikel erf\u00e4hrst du auch, <a href=\"\/de\/algorithmen\/priorityqueue-java\/#was-ist-eine-priority-queue\">was eine Priotity Queue ist<\/a>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wie bei der <code>PriorityQueue<\/code> werden die Elemente in einem Array gespeichert, das einen <a rel=\"noopener\" href=\"https:\/\/de.wikipedia.org\/wiki\/Heap_(Datenstruktur)\" target=\"_blank\">Min-Heap<\/a> repr\u00e4sentiert; der Iterator durchl\u00e4uft die Elemente in entsprechender Reihenfolge.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Threadsicherheit wird durch ein einzelnes <code>ReentrantLock<\/code> sichergestellt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die <code>PriorityBlockingQueue<\/code> ist nicht bounded, sie hat also keine Kapazit\u00e4tsgrenze. Das bedeutet, dass <code><code>put(e)<\/code><\/code> und <code>offer(e, time, unit)<\/code> niemals blockieren. Nur die Dequeue-Operationen <code>take()<\/code> und <code>poll(time, unit)<\/code> blockieren, wenn die Queue leer ist.<\/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\"><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\">Min-Heap<br><span style=\"font-size:90%\">(gespeichert in einem Array)<\/span><\/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\">Die <code>PriorityBlockingQueue<\/code> wird im JDK nicht genutzt. Es ist daher nicht auszuschlie\u00dfen, dass sie Bugs enth\u00e4lt. Wenn du eine Queue mit entsprechenden Eigenschaften ben\u00f6tigst und die <code>PriorityBlockingQueue<\/code> verwendest, solltest du deine Anwendung intensiv testen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"priorityblockingqueue-beispiel\">PriorityBlockingQueue Beispiel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Das folgenden Beispiel zeigt, wie eine <code>PriorityBlockingQueue<\/code> angelegt wird und wie mehrere Threads lesend und schreibend darauf zugreifen (\u2192 <a href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/queue\/PriorityBlockingQueueExample.java\" target=\"_blank\" rel=\"noopener\">Code auf GitHub<\/a>).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Lesende Threads starten alle 3 Sekunden, beginnend sofort nach dem Erstellen der Queue.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Schreibende Threads starten nach 3,5 Sekunden (so dass bereits zwei lesende Threads warten) und schreiben sek\u00fcndlich einen Zufallswert in die Queue.<\/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\">PriorityBlockingQueueExample<\/span> <\/span>{\n  <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">final<\/span> <span class=\"hljs-keyword\">long<\/span> startTime = System.currentTimeMillis();\n\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 class=\"hljs-keyword\">throws<\/span> InterruptedException <\/span>{\n    BlockingQueue&lt;Integer&gt; queue = <span class=\"hljs-keyword\">new<\/span> PriorityBlockingQueue&lt;&gt;();\n    ScheduledExecutorService pool = Executors.newScheduledThreadPool(<span class=\"hljs-number\">10<\/span>);\n\n    <span class=\"hljs-comment\">\/\/ Start reading from the queue immediately, every 3 seconds<\/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\">8<\/span>; i++) {\n      <span class=\"hljs-keyword\">int<\/span> delaySeconds = i * <span class=\"hljs-number\">3<\/span>;\n      pool.schedule(() -&gt; dequeue(queue), delaySeconds, TimeUnit.SECONDS);\n    }\n\n    <span class=\"hljs-comment\">\/\/ Start writing to the queue after 3.5 seconds (so there are already 2 threads<\/span>\n    <span class=\"hljs-comment\">\/\/ waiting), every 1 seconds (so that the queue fills faster than it's emptied,<\/span>\n    <span class=\"hljs-comment\">\/\/ so that we see some more elements and their order in the queue)<\/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\">8<\/span>; i++) {\n      <span class=\"hljs-keyword\">int<\/span> delayMillis = <span class=\"hljs-number\">3500<\/span> + i * <span class=\"hljs-number\">1000<\/span>;\n      pool.schedule(() -&gt; enqueue(queue), delayMillis, TimeUnit.MILLISECONDS);\n    }\n\n    pool.shutdown();\n    pool.awaitTermination(<span class=\"hljs-number\">1<\/span>, TimeUnit.MINUTES);\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">enqueue<\/span><span class=\"hljs-params\">(BlockingQueue&lt;Integer&gt; queue)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">int<\/span> element = ThreadLocalRandom.current().nextInt(<span class=\"hljs-number\">10<\/span>, <span class=\"hljs-number\">100<\/span>);\n    log(<span class=\"hljs-string\">\"Calling queue.put(%d) (queue = %s)...\"<\/span>, element, queue);\n    <span class=\"hljs-keyword\">try<\/span> {\n      queue.put(element);\n      log(<span class=\"hljs-string\">\"queue.put(%d) returned (queue = %s)\"<\/span>, element, queue);\n    } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException ex) {\n      Thread.currentThread().interrupt();\n    }\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">dequeue<\/span><span class=\"hljs-params\">(BlockingQueue&lt;Integer&gt; queue)<\/span> <\/span>{\n    log(<span class=\"hljs-string\">\"    Calling queue.take() (queue = %s)...\"<\/span>, queue);\n    <span class=\"hljs-keyword\">try<\/span> {\n      Integer element = queue.take();\n      log(<span class=\"hljs-string\">\"    queue.take() returned %d (queue = %s)\"<\/span>, element, queue);\n    } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n      Thread.currentThread().interrupt();\n    }\n  }\n\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">log<\/span><span class=\"hljs-params\">(String format, Object... args)<\/span> <\/span>{\n    System.out.printf(\n        Locale.US,\n        <span class=\"hljs-string\">\"&#091;%4.1fs] &#091;%-16s] %s%n\"<\/span>,\n        (System.currentTimeMillis() - startTime) \/ <span class=\"hljs-number\">1000.0<\/span>,\n        Thread.currentThread().getName(),\n        String.format(format, args));\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\">Im folgenden siehst du eine beispielhafte Ausgabe des Programms:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"Klartext\" data-shcb-language-slug=\"plaintext\"><span><code class=\"hljs language-plaintext\">&#091; 0.0s] &#091;pool-1-thread-1 ]     Calling queue.take() (queue = &#091;])...\n&#091; 3.0s] &#091;pool-1-thread-2 ]     Calling queue.take() (queue = &#091;])...\n&#091; 3.5s] &#091;pool-1-thread-6 ] Calling queue.put(87) (queue = &#091;])...\n&#091; 3.5s] &#091;pool-1-thread-6 ] queue.put(87) returned (queue = &#091;])\n&#091; 3.5s] &#091;pool-1-thread-1 ]     queue.take() returned 87 (queue = &#091;])\n&#091; 4.5s] &#091;pool-1-thread-9 ] Calling queue.put(89) (queue = &#091;])...\n&#091; 4.5s] &#091;pool-1-thread-9 ] queue.put(89) returned (queue = &#091;])\n&#091; 4.5s] &#091;pool-1-thread-2 ]     queue.take() returned 89 (queue = &#091;])\n&#091; 5.5s] &#091;pool-1-thread-7 ] Calling queue.put(31) (queue = &#091;])...\n&#091; 5.5s] &#091;pool-1-thread-7 ] queue.put(31) returned (queue = &#091;31])\n&#091; 6.0s] &#091;pool-1-thread-4 ]     Calling queue.take() (queue = &#091;31])...\n&#091; 6.0s] &#091;pool-1-thread-4 ]     queue.take() returned 31 (queue = &#091;])\n&#091; 6.5s] &#091;pool-1-thread-5 ] Calling queue.put(71) (queue = &#091;])...\n&#091; 6.5s] &#091;pool-1-thread-5 ] queue.put(71) returned (queue = &#091;71])\n&#091; 7.5s] &#091;pool-1-thread-8 ] Calling queue.put(15) (queue = &#091;71])...\n&#091; 7.5s] &#091;pool-1-thread-8 ] queue.put(15) returned (queue = &#091;15, 71])\n&#091; 8.5s] &#091;pool-1-thread-10] Calling queue.put(33) (queue = &#091;15, 71])...\n&#091; 8.5s] &#091;pool-1-thread-10] queue.put(33) returned (queue = &#091;15, 71, 33])\n&#091; 9.0s] &#091;pool-1-thread-3 ]     Calling queue.take() (queue = &#091;15, 71, 33])...\n&#091; 9.0s] &#091;pool-1-thread-3 ]     queue.take() returned 15 (queue = &#091;33, 71])\n&#091; 9.5s] &#091;pool-1-thread-6 ] Calling queue.put(58) (queue = &#091;33, 71])...\n&#091; 9.5s] &#091;pool-1-thread-6 ] queue.put(58) returned (queue = &#091;33, 71, 58])\n&#091;10.5s] &#091;pool-1-thread-1 ] Calling queue.put(19) (queue = &#091;33, 71, 58])...\n&#091;10.5s] &#091;pool-1-thread-1 ] queue.put(19) returned (queue = &#091;19, 33, 58, 71])\n&#091;12.0s] &#091;pool-1-thread-9 ]     Calling queue.take() (queue = &#091;19, 33, 58, 71])...\n&#091;12.0s] &#091;pool-1-thread-9 ]     queue.take() returned 19 (queue = &#091;33, 71, 58])\n&#091;15.0s] &#091;pool-1-thread-2 ]     Calling queue.take() (queue = &#091;33, 71, 58])...\n&#091;15.0s] &#091;pool-1-thread-2 ]     queue.take() returned 33 (queue = &#091;58, 71])\n&#091;18.0s] &#091;pool-1-thread-7 ]     Calling queue.take() (queue = &#091;58, 71])...\n&#091;18.0s] &#091;pool-1-thread-7 ]     queue.take() returned 58 (queue = &#091;71])\n&#091;21.0s] &#091;pool-1-thread-4 ]     Calling queue.take() (queue = &#091;71])...\n&#091;21.0s] &#091;pool-1-thread-4 ]     queue.take() returned 71 (queue = &#091;])<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><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=\"wp-block-paragraph\">Was kann man in dieser Beispielausgabe erkennen?<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Zun\u00e4chst einmal siehst du, wie nach 0,0 s und 3,0 s die Threads 1 und 2 beim Aufruf von <code>take()<\/code> blockieren, da die Queue leer ist.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach 3,5 s schreibt Thread 6 die 87 in die Queue. Sofort im Anschluss wacht der zuvor blockierte Thread 1 auf und entnimmt die 87 wieder.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach 4,5 s schreibt Thread 9 die 89 in die Queue, die sofort von Thread 2 wieder entnommen wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach 5,5 s wird die 31 in die Queue geschrieben, die nach 6,0 s wieder entnommen wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach 6,5 s, 7,5 s und 8,5 s werden die 71, die 15 und die 33 in die Queue geschrieben. Du siehst, wie jeweils das kleinste Element vorne (links) in der Queue steht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach 9,0 s wird das kleinste Elemente, die 15, entnommen. Daraufhin steht das n\u00e4chstkleinere Element, die 33 am Kopf der Queue. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach 9,5 s und 10,5 s werden zwei weitere Elemente, 58 und 19, in die Queue geschrieben. Du siehst wieder gut, wie jeweils das kleinste Element am Kopf der Queue steht.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Queue enth\u00e4lt nun vier Elemente. Es werden keine weiteren Elemente in die Queue geschrieben und die existierenden Elemente entsprechend ihrer Priorit\u00e4t entnommen.<\/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 erfahren, welche Eigenschaften die <code>PriorityBlockingQueue<\/code> hat und wie diese eingesetzt wird.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Ab dem n\u00e4chsten Teil der Tutorial-Serie stelle ich dir einige Queue-Implementierungen f\u00fcr Sonderf\u00e4lle vor, beginnend mit der <a href=\"\/de\/algorithmen\/delayqueue-java\/\">DelayQueue<\/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 PriorityBlockingQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?<\/p>\n","protected":false},"author":1,"featured_media":29409,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Wie benutzt man die Java PriorityBlockingQueue? 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":"PriorityBlockingQueue","_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":8537,"_post_count":0,"footnotes":""},"categories":[127],"tags":[192],"class_list":["post-29096","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\/container-4203677-1770x986-1.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-1770x986-1.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/container-4203677-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 PriorityBlockingQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?","public_identification_id":"40887519dc1d4439a1576a04058ad584","private_identification_id":"0b2ae5e37b56465f98d050d8ca0a9422","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29096","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=29096"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29096\/revisions"}],"predecessor-version":[{"id":41711,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29096\/revisions\/41711"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/29409"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=29096"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=29096"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=29096"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}