{"id":29066,"date":"2022-04-20T17:06:28","date_gmt":"2022-04-20T15:06:28","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=29066"},"modified":"2024-11-27T15:09:28","modified_gmt":"2024-11-27T14:09:28","slug":"linkedblockingqueue-java","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/linkedblockingqueue-java\/","title":{"rendered":"LinkedBlockingQueue in Java (mit Beispiel)"},"content":{"rendered":"\n<p>In diesem Teil der Tutorialserie geht es um die <code>LinkedBlockingQueue<\/code>. Du wirst deren speziellen Eigenschaften kennenlernen und anhand eines Beispiels sehen, wie man diese Queue einsetzt. Au\u00dferdem wirst du erfahren, wann du genau diese Queue einsetzen solltest.<\/p>\n\n\n\n<p>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\/LinkedBlockingQueue-class-hierarchy-800x500.png\" alt=\"LinkedBlockingQueue in der Klassenhierarchie\" class=\"wp-image-29067\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedBlockingQueue-class-hierarchy-800x500.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedBlockingQueue-class-hierarchy-224x140.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedBlockingQueue-class-hierarchy-336x210.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedBlockingQueue-class-hierarchy-504x315.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedBlockingQueue-class-hierarchy-672x420.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedBlockingQueue-class-hierarchy-400x250.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedBlockingQueue-class-hierarchy-600x375.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedBlockingQueue-class-hierarchy-944x590.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedBlockingQueue-class-hierarchy-1200x750.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedBlockingQueue-class-hierarchy.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>LinkedBlockingQueue in der Klassenhierarchie<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"linkedblockingqueue-eigenschaften\">LinkedBlockingQueue Eigenschaften<\/h2>\n\n\n\n<p>Die Klasse <code>java.util.concurrent<\/code>.<code>LinkedBlockingQueue<\/code> basiert \u2013 genau wie <a href=\"\/de\/algorithmen\/concurrentlinkedqueue-java\/\">ConcurrentLinkedQueue<\/a> \u2013 auf einer verketteten Liste, ist allerdings \u2013 ebenso wie die im n\u00e4chsten Teil vorgestellte <a href=\"\/de\/algorithmen\/arrayblockingqueue-java\/\">ArrayBlockingQueue<\/a> \u2013 threadsicher (<a href=\"#ist-linkedblockingqueue-threadsicher\">s. u.<\/a>), bounded und blockierend.<\/p>\n\n\n\n<p>Anders als die <code>ArrayBlockingQueue<\/code> bietet <code>LinkedBlockingQueue<\/code> keine Fairness Policy an. (Fairness Policy bedeutet, dass blockierende Methoden in der Reihenfolge bedient werden, in der sie aufgerufen werden.)<\/p>\n\n\n\n<p>Die Queue-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\">Verkettete Liste<\/td><td class=\"has-text-align-center\" data-align=\"center\">Ja<br><span style=\"font-size:90%\">(pessimistisches Locking mit zwei Locks)<\/span><\/td><td class=\"has-text-align-center\" data-align=\"center\">Blocking<\/td><td class=\"has-text-align-center\" data-align=\"center\">Nicht verf\u00fcgbar<\/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\">\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>Ich empfehle <code>LinkedBlockingQueue<\/code>, wenn du eine blockierende, threadsichere Queue ben\u00f6tigst.<\/p>\n\n\n\n<p>Die Klasse <code>LinkedBlockingQueue<\/code> wird \u00fcbrigens von <code>Executors.newFixedThreadPool()<\/code> und <code>Executors.newSingleThreadedExecutor()<\/code> als \"work queue\" f\u00fcr den Executor verwendet. Sie wird somit intensiv genutzt, was die Wahrscheinlichkeit f\u00fcr Bugs \u00e4u\u00dferst gering h\u00e4lt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"linkedblockingqueue-beispiel\">LinkedBlockingQueue Beispiel<\/h2>\n\n\n\n<p>Das folgende Beispiel zeigt, wie die <code>LinkedBlockingQueue<\/code> verwendet wird. Wir erzeugen eine Queue mit der Kapazit\u00e4t 3. Direkt im Anschluss beginnen wir im Abstand von jeweils drei Sekunden Elemente aus der Queue zu lesen. Erst nach 3,5 Sekunden beginnen wir im Abstand von jeweils einer Sekunde Elemente in die Queue zu schreiben (\u2192 <a rel=\"noopener\" href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/queue\/LinkedBlockingQueueExample.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\">LinkedBlockingQueueExample<\/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> LinkedBlockingQueue&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>Im folgenden siehst du die Ausgabe des Beispiel-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-4 ]     Calling queue.take() (queue = &#091;])...\n&#091; 3.5s] &#091;pool-1-thread-8 ] Calling queue.put(0) (queue = &#091;])...\n&#091; 3.5s] &#091;pool-1-thread-1 ]     queue.take() returned 0 (queue = &#091;])\n&#091; 3.5s] &#091;pool-1-thread-8 ] queue.put(0) returned (queue = &#091;])\n&#091; 4.5s] &#091;pool-1-thread-5 ] Calling queue.put(1) (queue = &#091;])...\n&#091; 4.5s] &#091;pool-1-thread-4 ]     queue.take() returned 1 (queue = &#091;])\n&#091; 4.5s] &#091;pool-1-thread-5 ] queue.put(1) returned (queue = &#091;])\n&#091; 5.5s] &#091;pool-1-thread-3 ] Calling queue.put(2) (queue = &#091;])...\n&#091; 5.5s] &#091;pool-1-thread-3 ] queue.put(2) returned (queue = &#091;2])\n&#091; 6.0s] &#091;pool-1-thread-7 ]     Calling queue.take() (queue = &#091;2])...\n&#091; 6.0s] &#091;pool-1-thread-7 ]     queue.take() returned 2 (queue = &#091;])\n&#091; 6.5s] &#091;pool-1-thread-9 ] Calling queue.put(3) (queue = &#091;])...\n&#091; 6.5s] &#091;pool-1-thread-9 ] queue.put(3) returned (queue = &#091;3])\n&#091; 7.5s] &#091;pool-1-thread-6 ] Calling queue.put(4) (queue = &#091;3])...\n&#091; 7.5s] &#091;pool-1-thread-6 ] queue.put(4) returned (queue = &#091;3, 4])\n&#091; 8.5s] &#091;pool-1-thread-2 ] Calling queue.put(5) (queue = &#091;3, 4])...\n&#091; 8.5s] &#091;pool-1-thread-2 ] queue.put(5) returned (queue = &#091;3, 4, 5])\n&#091; 9.0s] &#091;pool-1-thread-10]     Calling queue.take() (queue = &#091;3, 4, 5])...\n&#091; 9.0s] &#091;pool-1-thread-10]     queue.take() returned 3 (queue = &#091;4, 5])\n&#091; 9.5s] &#091;pool-1-thread-1 ] Calling queue.put(6) (queue = &#091;4, 5])...\n&#091; 9.5s] &#091;pool-1-thread-1 ] queue.put(6) returned (queue = &#091;4, 5, 6])\n&#091;10.5s] &#091;pool-1-thread-8 ] Calling queue.put(7) (queue = &#091;4, 5, 6])...\n&#091;11.5s] &#091;pool-1-thread-4 ] Calling queue.put(8) (queue = &#091;4, 5, 6])...\n&#091;12.0s] &#091;pool-1-thread-5 ]     Calling queue.take() (queue = &#091;4, 5, 6])...\n&#091;12.0s] &#091;pool-1-thread-5 ]     queue.take() returned 4 (queue = &#091;5, 6, 7])\n&#091;12.0s] &#091;pool-1-thread-8 ] queue.put(7) returned (queue = &#091;5, 6, 7])\n&#091;12.5s] &#091;pool-1-thread-3 ] Calling queue.put(9) (queue = &#091;5, 6, 7])...\n&#091;15.0s] &#091;pool-1-thread-7 ]     Calling queue.take() (queue = &#091;5, 6, 7])...\n&#091;15.0s] &#091;pool-1-thread-7 ]     queue.take() returned 5 (queue = &#091;6, 7, 8])\n&#091;15.0s] &#091;pool-1-thread-4 ] queue.put(8) returned (queue = &#091;6, 7, 8])\n&#091;18.0s] &#091;pool-1-thread-9 ]     Calling queue.take() (queue = &#091;6, 7, 8])...\n&#091;18.0s] &#091;pool-1-thread-3 ] queue.put(9) returned (queue = &#091;7, 8, 9])\n&#091;18.0s] &#091;pool-1-thread-9 ]     queue.take() returned 6 (queue = &#091;7, 8, 9])\n&#091;21.0s] &#091;pool-1-thread-6 ]     Calling queue.take() (queue = &#091;7, 8, 9])...\n&#091;21.0s] &#091;pool-1-thread-6 ]     queue.take() returned 7 (queue = &#091;8, 9])\n&#091;24.0s] &#091;pool-1-thread-2 ]     Calling queue.take() (queue = &#091;8, 9])...\n&#091;24.0s] &#091;pool-1-thread-2 ]     queue.take() returned 8 (queue = &#091;9])\n&#091;27.0s] &#091;pool-1-thread-10]     Calling queue.take() (queue = &#091;9])...\n&#091;27.0s] &#091;pool-1-thread-10]     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>Da wir erst mit dem Schreiben beginnen, nachdem bereits zwei Threads <code>take()<\/code> aufrufen, blockieren diese ersten zwei Leseversuche bei 0,0 und 3,0 s (Thread 1 und 4).<\/p>\n\n\n\n<p>Nach 3,5 s wird das erste Element geschrieben (Thread 8). Dadurch wird Thread 1 aufgeweckt und die <code>take()<\/code> Methode entnimmt dieses Element sofort wieder aus der Queue. <\/p>\n\n\n\n<p>Nach 4,5 s wird das zweite Element geschrieben (Thread 5). Thread 4 wird aufgeweckt und entnimmt dieses Element wieder aus der Queue.<\/p>\n\n\n\n<p>Das Programm schreibt schneller als es liest. Nach 10,5 s blockiert daher zum ersten Mal ein schreibender Thread (Thread 8) beim Versuch die 7 in die - zu dem Zeitpunkt volle - Queue zu schreiben. Nach 11,5 s blockiert ebenfalls Thread 4 beim Versuch die 8 in die Queue zu schreiben.<\/p>\n\n\n\n<p>Nach 12,0 s entnimmt Thread 5 ein Element aus der Queue. Dadurch wird in der Queue ein Platz frei. Thread 8 wird aufgeweckt und schreibt die 7 in die Queue.    <\/p>\n\n\n\n<p>Versuch einmal selbst die restlichen Ausgaben zu lesen und zu verstehen.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"ist-linkedblockingqueue-threadsicher\">Ist LinkedBlockingQueue threadsicher?<\/h2>\n\n\n\n<p>Ja, <code>LinkedBlockingQueue<\/code> ist threadsicher.<\/p>\n\n\n\n<p>Die Threadsicherheit der <code>LinkedBlockingQueue<\/code> wird durch pessimistisches Locking mittels zweier separater <code>ReentrantLock<\/code> f\u00fcr Schreib- und Leseoperationen gew\u00e4hrleistet. So kann es zu keiner Contention (Zugriffskonflikten) zwischen Producer- und Consumer-Threads kommen.<\/p>\n\n\n\n<p>Unterschiede zu anderen Queues:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><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><li><a href=\"\/de\/algorithmen\/arrayblockingqueue-java\/\">ArrayBlockingQueue<\/a> wird mit nur <em>einem<\/em> <code>ReentrantLock<\/code> gesch\u00fctzt, so dass dort Zugriffskonflikte zwischen Producer- und Consumer-Threads m\u00f6glich sind.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"linkedblockingqueue-zeitkomplexitaet\">LinkedBlockingQueue Zeitkomplexit\u00e4t<\/h2>\n\n\n\n<p>Wie bei allen Queues ist der Aufwand f\u00fcr die Enqueue- und Dequeue-Operationen unabh\u00e4ngig von der L\u00e4nge der Queue. Die <a href=\"\/de\/algorithmen\/o-notation-zeitkomplexitaet\/\">Zeitkomplexit\u00e4t<\/a> betr\u00e4gt also <em>O(1)<\/em>.<\/p>\n\n\n\n<p>Dies gilt auch f\u00fcr die <code>size()<\/code>-Methode. Im Gegensatz zur ebenfalls auf einer verketteten Liste basierenden <code>ConcurrentLinkedQueue<\/code>, die bei jedem Aufruf von <code>size()<\/code> die komplette Liste durchl\u00e4uft, um die Elemente zu z\u00e4hlen, verwendet <code>LinkedBlockingQueue<\/code> intern ein <code>AtomicInteger<\/code>, das beim Einf\u00fcgen und Entnehmen aktualisiert wird, und somit die Gr\u00f6\u00dfe mit konstantem Aufwand verf\u00fcgbar h\u00e4lt.<\/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>In diesem Artikel hast du die <code>LinkedBlockingQueue<\/code> kennengelernt \u2013 eine threadsichere, blockierende, bounded Queue. An einem Beispiel hast du gesehen, wie du <code>LinkedBlockingQueue<\/code> einsetzen kannst. Du hast au\u00dferdem erfahren, in welchen F\u00e4llen du <code>LinkedBlockingQueue<\/code> einsetzen solltest.<\/p>\n\n\n\n<p><code>LinkedBlockingQueue<\/code> basiert auf einer verketteten Liste. Im n\u00e4chsten Teil des Tutorials geht es um das auf einem Array basierende Pendant \u2013 die <a href=\"\/de\/algorithmen\/arrayblockingqueue-java\/\">ArrayBlockingQueue<\/a>.<\/p>\n\n\n\n<p>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 LinkedBlockingQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?<\/p>\n","protected":false},"author":1,"featured_media":29403,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_robots_primary_cat":"none","_seopress_titles_title":"","_seopress_titles_desc":"Wie benutzt man die Java LinkedBlockingQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?","_seopress_robots_index":"","_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":10330,"_post_count":0,"footnotes":""},"categories":[127],"tags":[192],"class_list":["post-29066","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\/metal-chain-4736603-1770x986-1-scaled.jpg",2560,1426,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-scaled.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-scaled.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-scaled.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-scaled.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-scaled.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/metal-chain-4736603-1770x986-1-scaled.jpg",2048,1141,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 LinkedBlockingQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?","public_identification_id":"44d8fc46158146dd9fa1e094f46143d5","private_identification_id":"f9bcb444944040258b6728ff666983aa","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29066","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=29066"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29066\/revisions"}],"predecessor-version":[{"id":41708,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29066\/revisions\/41708"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/29403"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=29066"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=29066"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=29066"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}