{"id":29073,"date":"2022-04-20T17:07:46","date_gmt":"2022-04-20T15:07:46","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=29073"},"modified":"2024-11-27T15:08:38","modified_gmt":"2024-11-27T14:08:38","slug":"arrayblockingqueue-java","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/arrayblockingqueue-java\/","title":{"rendered":"ArrayBlockingQueue in Java (mit Beispiel)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">Im diesem Artikel geht es um die <code>ArrayBlockingQueue<\/code> und deren Eigenschaften. Du siehst anhand eines Beispiels, wie die <code>ArrayBlockingQueue<\/code> eingesetzt wird. Au\u00dferdem gebe ich dir eine Empfehlung, in welchen F\u00e4llen du diese Queue einsetzen solltest.<\/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_800\"><img decoding=\"async\" width=\"800\" height=\"500\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ArrayBlockingQueue-class-hierarchy-800x500.png\" alt=\"ArrayBlockingQueue in der Klassenhierarchie\" class=\"wp-image-29076\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ArrayBlockingQueue-class-hierarchy-800x500.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ArrayBlockingQueue-class-hierarchy-224x140.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ArrayBlockingQueue-class-hierarchy-336x210.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ArrayBlockingQueue-class-hierarchy-504x315.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ArrayBlockingQueue-class-hierarchy-672x420.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ArrayBlockingQueue-class-hierarchy-400x250.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ArrayBlockingQueue-class-hierarchy-600x375.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ArrayBlockingQueue-class-hierarchy-944x590.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ArrayBlockingQueue-class-hierarchy-1200x750.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/ArrayBlockingQueue-class-hierarchy.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>ArrayBlockingQueue in der Klassenhierarchie<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"arrayblockingqueue-eigenschaften\">ArrayBlockingQueue Eigenschaften<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Die Klasse <code>java.util.concurrent.ArrayBlockingQueue<\/code> basiert auf einem Array und ist \u2013 wie die meisten Queue-Implementierungen \u2013 threadsicher (<a href=\"#ist-arrayblockingqueue-threadsicher\">s. u.<\/a>). Sie ist bounded (hat eine maximale Kapazit\u00e4t), entsprechend blockierend und bietet eine Fairness Policy (d. h. blockierende Methoden werden in der Reihenfolge bedient, in der sie aufgerufen wurden).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Eigenschaften in der \u00dcbersicht:<\/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\">Array<\/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<\/td><td class=\"has-text-align-center\" data-align=\"center\">Optional<\/td><td class=\"has-text-align-center\" data-align=\"center\">Bounded<\/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\">Aufgrund der m\u00f6glicherweise hohen Contention bei gleichzeitigem Schreib- und Lesezugriff solltest du \u2013 wenn du eine blockierende, threadsichere Queue ben\u00f6tigst \u2013 f\u00fcr deinen speziellen Einsatzweck testen, ob evtl. eine <code>LinkedBlockingQueue<\/code> performanter ist. Diese basiert zwar auf einer verketteten Liste, verwendet allerdings zum Schreiben und Lesen zwei separate <code>ReentrantLock<\/code>s, was die Zugangskonflikte reduziert.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"arrayblockingqueue-beispiel\">ArrayBlockingQueue Beispiel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Im folgenden Beispiel erzeugen wir eine ArrayBlockingQueue mit der Kapazit\u00e4t 3. Dann lassen wir \u00fcber einen <code>ScheduledExecutorService<\/code> in bestimmten Abst\u00e4nden Elemente in die Queue schreiben und aus ihr lesen (\u2192 <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/queue\/ArrayBlockingQueueExample.java\" target=\"_blank\">Code auf GitHub<\/a>):<\/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\">ArrayBlockingQueueExample<\/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> ArrayBlockingQueue&lt;&gt;(<span class=\"hljs-number\">3<\/span>);\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\">10<\/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 a full queue soon)<\/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\">10<\/span>; i++) {\n      <span class=\"hljs-keyword\">int<\/span> element = i; <span class=\"hljs-comment\">\/\/ Assign to an effectively final variable<\/span>\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, element), 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 class=\"hljs-keyword\">int<\/span> element)<\/span> <\/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 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\">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\">Wir versuchen alle drei Sekunden, beginnend sofort, ein Element aus der Queue zu lesen. Wir schreiben die Elemente sek\u00fcndlich, fangen allerdings erst nach 3,5 s damit an. Zu diesem Zeitpunkt sollten also bereits zwei lesende Threads blockiert haben und darauf warten, dass Elemente in die Queue geschrieben werden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Da wir schneller schreiben als lesen, sollte die Queue bald ihre Kapazit\u00e4tsgrenze erreicht haben. Ab dem Moment sollten die schreibenden Threads so lange blockieren, bis die lesenden Threads aufgeholt haben.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Hier eine beispielhafte Ausgabe:<\/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-3 ] Calling queue.put(0) (queue = &#091;])...\n&#091; 3.5s] &#091;pool-1-thread-3 ] queue.put(0) returned (queue = &#091;])\n&#091; 3.5s] &#091;pool-1-thread-1 ]     queue.take() returned 0 (queue = &#091;])\n&#091; 4.5s] &#091;pool-1-thread-9 ] Calling queue.put(1) (queue = &#091;])...\n&#091; 4.5s] &#091;pool-1-thread-9 ] queue.put(1) returned (queue = &#091;])\n&#091; 4.5s] &#091;pool-1-thread-2 ]     queue.take() returned 1 (queue = &#091;])\n&#091; 5.5s] &#091;pool-1-thread-7 ] Calling queue.put(2) (queue = &#091;])...\n&#091; 5.5s] &#091;pool-1-thread-7 ] queue.put(2) returned (queue = &#091;2])\n&#091; 6.0s] &#091;pool-1-thread-8 ]     Calling queue.take() (queue = &#091;2])...\n&#091; 6.0s] &#091;pool-1-thread-8 ]     queue.take() returned 2 (queue = &#091;])\n&#091; 6.5s] &#091;pool-1-thread-5 ] Calling queue.put(3) (queue = &#091;])...\n&#091; 6.5s] &#091;pool-1-thread-5 ] queue.put(3) returned (queue = &#091;3])\n&#091; 7.5s] &#091;pool-1-thread-4 ] Calling queue.put(4) (queue = &#091;3])...\n&#091; 7.5s] &#091;pool-1-thread-4 ] queue.put(4) returned (queue = &#091;3, 4])\n&#091; 8.5s] &#091;pool-1-thread-10] Calling queue.put(5) (queue = &#091;3, 4])...\n&#091; 8.5s] &#091;pool-1-thread-10] queue.put(5) returned (queue = &#091;3, 4, 5])\n&#091; 9.0s] &#091;pool-1-thread-6 ]     Calling queue.take() (queue = &#091;3, 4, 5])...\n&#091; 9.0s] &#091;pool-1-thread-6 ]     queue.take() returned 3 (queue = &#091;4, 5])\n&#091; 9.5s] &#091;pool-1-thread-3 ] Calling queue.put(6) (queue = &#091;4, 5])...\n&#091; 9.5s] &#091;pool-1-thread-3 ] queue.put(6) returned (queue = &#091;4, 5, 6])\n&#091;10.5s] &#091;pool-1-thread-1 ] Calling queue.put(7) (queue = &#091;4, 5, 6])...\n&#091;11.5s] &#091;pool-1-thread-9 ] Calling queue.put(8) (queue = &#091;4, 5, 6])...\n&#091;12.0s] &#091;pool-1-thread-2 ]     Calling queue.take() (queue = &#091;4, 5, 6])...\n&#091;12.0s] &#091;pool-1-thread-2 ]     queue.take() returned 4 (queue = &#091;5, 6, 7])\n&#091;12.0s] &#091;pool-1-thread-1 ] queue.put(7) returned (queue = &#091;5, 6, 7])\n&#091;12.5s] &#091;pool-1-thread-7 ] Calling queue.put(9) (queue = &#091;5, 6, 7])...\n&#091;15.0s] &#091;pool-1-thread-8 ]     Calling queue.take() (queue = &#091;5, 6, 7])...\n&#091;15.0s] &#091;pool-1-thread-8 ]     queue.take() returned 5 (queue = &#091;6, 7, 8])\n&#091;15.0s] &#091;pool-1-thread-9 ] queue.put(8) returned (queue = &#091;6, 7, 8])\n&#091;18.0s] &#091;pool-1-thread-5 ]     Calling queue.take() (queue = &#091;6, 7, 8])...\n&#091;18.0s] &#091;pool-1-thread-5 ]     queue.take() returned 6 (queue = &#091;7, 8, 9])\n&#091;18.0s] &#091;pool-1-thread-7 ] queue.put(9) returned (queue = &#091;7, 8, 9])\n&#091;21.0s] &#091;pool-1-thread-4 ]     Calling queue.take() (queue = &#091;7, 8, 9])...\n&#091;21.0s] &#091;pool-1-thread-4 ]     queue.take() returned 7 (queue = &#091;8, 9])\n&#091;24.0s] &#091;pool-1-thread-10]     Calling queue.take() (queue = &#091;8, 9])...\n&#091;24.0s] &#091;pool-1-thread-10]     queue.take() returned 8 (queue = &#091;9])\n&#091;27.0s] &#091;pool-1-thread-6 ]     Calling queue.take() (queue = &#091;9])...\n&#091;27.0s] &#091;pool-1-thread-6 ]     queue.take() returned 9 (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\">Wie vorausgesehen blockieren die ersten zwei Leseversuche bei 0,0 s und 3,0 s, da noch keine Elemente in die Queue geschrieben wurden.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach 3,5 s wird das erste Element geschrieben. Dadurch wird der erste Thread aufgeweckt und entnimmt dieses Element wieder. Nach 4,5 s wird das zweite Element geschrieben und der zweite Thread aufgeweckt, um das Element zu entnehmen.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Da das Programm schneller schreibt als liest, blockieren nach 10,5 s Thread 1, nach 11,5 s Thread 9 und nach 12,5 s Thread 7 beim Versuch weitere Elemente in die zu dem Zeitpunkt volle Queue zu schreiben. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach 12,0 s wird ein Element entnommen und Thread 1 kann mit dem Schreiben fortfahren. Nach 15,0 s wird ein weiteres Element entnommen und Thread 9 kann fortfahren. Nach 18,0 s kann Thread 7 fortfahren. <\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Da keine weiteren Elemente in die Queue geschrieben werden, leert sie sich gegen Ende wieder.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"ist-arrayblockingqueue-threadsicher\">Ist ArrayBlockingQueue threadsicher?<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Ja, <code>ArrayBlockingQueue<\/code> ist threadsicher.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Threadsicherheit von <code>ArrayBlockingQueue<\/code> wird durch ein einzelnes <code>ReentrantLock<\/code> gew\u00e4hrleistet. Dieses wird sowohl f\u00fcr den Kopf als auch f\u00fcr das Ende der Queue verwendet, so dass es bei gleichzeitigen Schreib- und Lesezugriffen zu Zugriffskonflikten (\"thread contention\") zwischen Producer- und Consumer-Threads kommen kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Explizite Locks wie <code>ReentrantLock<\/code> sind haupts\u00e4chlich f\u00fcr Einsatzgebiete geeignet, in denen es zu hoher Thread Contention kommt. Bei niedriger bis moderater Contention ist optimistisches Locking performanter.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Unterschiede zu anderen Queues:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Bei <a href=\"\/de\/algorithmen\/linkedblockingqueue-java\/\">LinkedBlockingQueue<\/a> wird die Threadsicherheit nicht nur durch eines, sondern durch zwei Locks gew\u00e4hrleistet. So k\u00f6nnen Producer- und Consumer-Threads sich nicht gegenseitig blockieren.<\/li><li>Bei <a href=\"\/de\/algorithmen\/concurrentlinkedqueue-java\/\">ConcurrentLinkedQueue<\/a> wird die Threadsicherheit durch optimistisches Locking via Compare-and-Set gew\u00e4hrleistet, was zu besserer Performance bei niedriger bis moderater Contention f\u00fchrt.<\/li><\/ul>\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\">Dieser Artikel hat dir die <code>ArrayBlockingQueue<\/code> vorgestellt. Diese Queue ist threadsicher, blockierend und bounded. Anhand eines Beispiels hast du gesehen, wie du <code>ArrayBlockingQueue<\/code> einsetzen kannst.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wie der Name schon sagt, basiert diese Queue auf einem Array. Das auf einer verketteten Liste basierende Pendant \u2013 <a href=\"\/de\/algorithmen\/linkedblockingqueue-java\/\">LinkedBlockingQueue<\/a> \u2013 wurde im vorherigen Teil der Serie behandelt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im n\u00e4chsten Teil der Serie geht es um die <a href=\"\/de\/algorithmen\/priorityblockingqueue-java\/\">PriorityBlockingQueue<\/a> \u2013 eine threadsichere und blockierende Variante der in einem vorherigen Teil vorgestellten <a href=\"https:\/\/www.happycoders.eu\/de\/algorithmen\/priorityqueue-java\/\">PriorityQueue<\/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 ArrayBlockingQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?<\/p>\n","protected":false},"author":1,"featured_media":29407,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Wie benutzt man die Java ArrayBlockingQueue? 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":"ArrayBlockingQueue","_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":10346,"_post_count":0,"footnotes":""},"categories":[127],"tags":[192],"class_list":["post-29073","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\/railing-3855288-1770x986-1.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-1770x986-1.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/railing-3855288-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 ArrayBlockingQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?","public_identification_id":"41fb570520804e02b9eb47486c07d190","private_identification_id":"af598ec9251b402097c01e38c531991c","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29073","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=29073"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29073\/revisions"}],"predecessor-version":[{"id":41703,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29073\/revisions\/41703"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/29407"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=29073"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=29073"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=29073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}