{"id":30438,"date":"2022-06-07T22:07:57","date_gmt":"2022-06-07T20:07:57","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=30438"},"modified":"2024-11-27T15:09:21","modified_gmt":"2024-11-27T14:09:21","slug":"linkedblockingdeque-java","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/linkedblockingdeque-java\/","title":{"rendered":"LinkedBlockingDeque in Java (mit Beispiel)"},"content":{"rendered":"\n<p>In diesem Teil der Tutorialserie erf\u00e4hrst du alles \u00fcber das <code>LinkedBlockingDeque<\/code>:<\/p>\n\n\n\n<ul class=\"hc-checked-list wp-block-list\"><li>Was sind die Eigenschaften von <code>LinkedBlockingDeque<\/code>?<\/li><li>Wann sollte man es einsetzen?<\/li><li>Wie setzt man es ein (Java-Beispiel)?<\/li><\/ul>\n\n\n\n<p>Wir befinden uns hier in der Klassenhierarchie:<\/p>\n\n\n<div class=\"wp-block-image\">\n<figure class=\"aligncenter size-full_800\"><img decoding=\"async\" width=\"800\" height=\"500\" src=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-LinkedBlockingDeque-class-hierarchy-800x500.png\" alt=\"LinkedBlockingDeque in der Klassenhierarchie\" class=\"wp-image-30776\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-LinkedBlockingDeque-class-hierarchy-800x500.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-LinkedBlockingDeque-class-hierarchy-224x140.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-LinkedBlockingDeque-class-hierarchy-336x210.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-LinkedBlockingDeque-class-hierarchy-504x315.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-LinkedBlockingDeque-class-hierarchy-672x420.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-LinkedBlockingDeque-class-hierarchy-400x250.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-LinkedBlockingDeque-class-hierarchy-600x375.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-LinkedBlockingDeque-class-hierarchy-944x590.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-LinkedBlockingDeque-class-hierarchy-1200x750.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/java-LinkedBlockingDeque-class-hierarchy.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>LinkedBlockingDeque in der Klassenhierarchie<\/figcaption><\/figure>\n<\/div>\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"linkedblockingdeque-eigenschaften\">LinkedBlockingDeque Eigenschaften<\/h2>\n\n\n\n<p>Die Klasse <code>java.util.concurrent.LinkedBlockingDeque<\/code> basiert \u2013 genau wie <a href=\"\/de\/algorithmen\/concurrentlinkeddeque-java\/\">ConcurrentLinkedDeque<\/a> \u2013 auf einer verketteten Liste, ist allerdings bounded (hat eine maximale Kapazit\u00e4t) und blockierend.<\/p>\n\n\n\n<p><code><code>LinkedBlockingDeque<\/code><\/code> ist das Deque-Pendant zu <a href=\"\/de\/algorithmen\/linkedblockingqueue-java\/\">LinkedBlockingQueue<\/a> und hat entsprechend \u00e4hnliche Eigenschaften:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Es basiert auf einer doppelt verketteten Liste.<\/li><li>Threadsicherheit wird durch ein einzelnes <code>ReentrantLock<\/code> garantiert, das von allen Enqueue- und Dequeue-Operationen geteilt wird (<code>LinkedBlockingQueue<\/code> hingegen verwendet <em>zwei<\/em> Locks \u2013 ein Enqueue-Lock und ein Dequeue-Lock).<\/li><li>Im Gegensatz zu <code>ConcurrentLinkedDeque<\/code> wird die Gr\u00f6\u00dfe des Deques in einem Feld gespeichert und nicht bei jedem Aufruf von <code>size()<\/code> durch Z\u00e4hlen der Listenknoten berechnet. Die Zeitkomplexit\u00e4t der <code>size()<\/code>-Methode lautet somit: <em>O(1)<\/em>.<\/li><li><code>LinkedBlockingDeque<\/code> bietet keine Fairness Policy an, d. h. blockierende Methoden werden in undefinierter Reihenfolge bedient (mit einer Fairness Policy w\u00fcrden sie in der Reihenfolge bedient werden, in der sie blockiert haben).<\/li><\/ul>\n\n\n\n<p>Die Deque-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 einem Lock)<\/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 im Deque 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>LinkedBlockingDeque<\/code>, wenn du ein blockierendes, threadsicheres Deque ben\u00f6tigst.<\/p>\n\n\n\n<p>F\u00fcr alle anderen Einsatzzwecke schaue dir den Artikel \"<a href=\"\/de\/algorithmen\/java-deque-implementierungen\/\">Deque Implementierungen \u2013 Welche einsetzen?<\/a>\" an.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"linkedblockingdeque-beispiel\">LinkedBlockingDeque Beispiel<\/h2>\n\n\n\n<p>Das folgende Beispiel, zeigt wie du <code>LinkedBlockingDeque<\/code> einsetzen kannst. Das Beispiel erweitert das <a href=\"\/de\/algorithmen\/linkedblockingqueue-java\/#linkedblockingqueue-beispiel\">LinkedBlockingQueue-Beispiel<\/a> dahingehend, dass es Elemente <em>auf einer zuf\u00e4lligen Seite<\/em> des Deques einf\u00fcgt bzw. entnimmt.<\/p>\n\n\n\n<p>Folgendes passiert im Beispiel:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Wir erstellen zun\u00e4chst eine <code>LinkedBlockingDeque<\/code> mit einer Kapazit\u00e4t f\u00fcr drei Elemente.<\/li><li>Dann planen wir zehn Dequeue-Operationen, die im Abstand von drei Sekunden Elemente aus dem Deque an zuf\u00e4lliger Seite entnehmen.<\/li><li>Au\u00dferdem planen wir zehn Enqueue-Operationen, die erst nach 3,5 Sekunden starten, dann aber im Abstand von jeweils nur einer Sekunde Elemente an einer zuf\u00e4lligen Seite des Deques einf\u00fcgen.<\/li><li>Dadurch, dass wir mit den Enqueue-Operationen sp\u00e4ter starten, k\u00f6nnen wir zu Beginn blockierende Dequeue-Operationen sehen.<\/li><li>Da wir dann deutlich schneller einf\u00fcgen als entnehmen, erreichen wir schnell die Deque-Kapazit\u00e4t, so dass auch Enqueue-Threads blockieren.<\/li><\/ul>\n\n\n\n<p>Du findest den Code in der Klasse <a href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/deque\/LinkedBlockingDequeExample.java\">LinkedBlockingDequeExample<\/a> auf GitHub.<\/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\">LinkedBlockingDequeExample<\/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    BlockingDeque&lt;Integer&gt; deque = <span class=\"hljs-keyword\">new<\/span> LinkedBlockingDeque&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 deque 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(deque), delaySeconds, TimeUnit.SECONDS);\n    }\n\n    <span class=\"hljs-comment\">\/\/ Start writing to the deque after 3.5 seconds (so there are already 2<\/span>\n    <span class=\"hljs-comment\">\/\/ threads waiting), every 1 seconds (so that the deque fills faster than<\/span>\n    <span class=\"hljs-comment\">\/\/ it's emptied, so that we see a full deque 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;\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(deque, 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\">(BlockingDeque&lt;Integer&gt; deque, <span class=\"hljs-keyword\">int<\/span> i)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (ThreadLocalRandom.current().nextBoolean()) {\n      enqueueAtFront(deque, i);\n    } <span class=\"hljs-keyword\">else<\/span> {\n      enqueueAtBack(deque, i);\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\">enqueueAtFront<\/span><span class=\"hljs-params\">(BlockingDeque&lt;Integer&gt; deque, <span class=\"hljs-keyword\">int<\/span> element)<\/span> <\/span>{\n    log(<span class=\"hljs-string\">\"Calling deque.putFirst(%d) (deque = %s)...\"<\/span>, element, deque);\n    <span class=\"hljs-keyword\">try<\/span> {\n      deque.putFirst(element);\n      log(<span class=\"hljs-string\">\"deque.putFirst(%d) returned (deque = %s)\"<\/span>, element, deque);\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\">enqueueAtBack<\/span><span class=\"hljs-params\">(BlockingDeque&lt;Integer&gt; deque, <span class=\"hljs-keyword\">int<\/span> element)<\/span> <\/span>{\n    log(<span class=\"hljs-string\">\"Calling deque.putLast(%d) (deque = %s)...\"<\/span>, element, deque);\n    <span class=\"hljs-keyword\">try<\/span> {\n      deque.putLast(element);\n      log(<span class=\"hljs-string\">\"deque.putLast(%d) returned (deque = %s)\"<\/span>, element, deque);\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\">(BlockingDeque&lt;Integer&gt; deque)<\/span> <\/span>{\n    <span class=\"hljs-keyword\">if<\/span> (ThreadLocalRandom.current().nextBoolean()) {\n      dequeueAtFront(deque);\n    } <span class=\"hljs-keyword\">else<\/span> {\n      dequeueAtBack(deque);\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\">dequeueAtFront<\/span><span class=\"hljs-params\">(BlockingDeque&lt;Integer&gt; deque)<\/span> <\/span>{\n    log(<span class=\"hljs-string\">\"    Calling deque.takeFirst() (deque = %s)...\"<\/span>, deque);\n    <span class=\"hljs-keyword\">try<\/span> {\n      Integer element = deque.takeFirst();\n      log(<span class=\"hljs-string\">\"    deque.takeFirst() returned %d (deque = %s)\"<\/span>, element, deque);\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\">dequeueAtBack<\/span><span class=\"hljs-params\">(BlockingDeque&lt;Integer&gt; deque)<\/span> <\/span>{\n    log(<span class=\"hljs-string\">\"    Calling deque.takeLast() (deque = %s)...\"<\/span>, deque);\n    <span class=\"hljs-keyword\">try<\/span> {\n      Integer element = deque.takeLast();\n      log(<span class=\"hljs-string\">\"    deque.takeLast() returned %d (deque = %s)\"<\/span>, element, deque);\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}\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>Hier 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 deque.takeLast() (deque = &#091;])...\n&#091; 3.0s] &#091;pool-1-thread-4 ]     Calling deque.takeFirst() (deque = &#091;])...\n&#091; 3.5s] &#091;pool-1-thread-2 ] Calling deque.putFirst(0) (deque = &#091;])...\n&#091; 3.5s] &#091;pool-1-thread-2 ] deque.putFirst(0) returned (deque = &#091;])\n&#091; 3.5s] &#091;pool-1-thread-1 ]     deque.takeLast() returned 0 (deque = &#091;])\n&#091; 4.5s] &#091;pool-1-thread-5 ] Calling deque.putLast(1) (deque = &#091;])...\n&#091; 4.5s] &#091;pool-1-thread-4 ]     deque.takeFirst() returned 1 (deque = &#091;])\n&#091; 4.5s] &#091;pool-1-thread-5 ] deque.putLast(1) returned (deque = &#091;])\n&#091; 5.5s] &#091;pool-1-thread-9 ] Calling deque.putLast(2) (deque = &#091;])...\n&#091; 5.5s] &#091;pool-1-thread-9 ] deque.putLast(2) returned (deque = &#091;2])\n&#091; 6.0s] &#091;pool-1-thread-3 ]     Calling deque.takeFirst() (deque = &#091;2])...\n&#091; 6.0s] &#091;pool-1-thread-3 ]     deque.takeFirst() returned 2 (deque = &#091;])\n&#091; 6.5s] &#091;pool-1-thread-7 ] Calling deque.putLast(3) (deque = &#091;])...\n&#091; 6.5s] &#091;pool-1-thread-7 ] deque.putLast(3) returned (deque = &#091;3])\n&#091; 7.5s] &#091;pool-1-thread-8 ] Calling deque.putFirst(4) (deque = &#091;3])...\n&#091; 7.5s] &#091;pool-1-thread-8 ] deque.putFirst(4) returned (deque = &#091;4, 3])\n&#091; 8.5s] &#091;pool-1-thread-8 ] Calling deque.putFirst(5) (deque = &#091;4, 3])...\n&#091; 8.5s] &#091;pool-1-thread-8 ] deque.putFirst(5) returned (deque = &#091;5, 4, 3])\n&#091; 9.0s] &#091;pool-1-thread-10]     Calling deque.takeFirst() (deque = &#091;5, 4, 3])...\n&#091; 9.0s] &#091;pool-1-thread-10]     deque.takeFirst() returned 5 (deque = &#091;4, 3])\n&#091; 9.5s] &#091;pool-1-thread-2 ] Calling deque.putLast(6) (deque = &#091;4, 3])...\n&#091; 9.5s] &#091;pool-1-thread-2 ] deque.putLast(6) returned (deque = &#091;4, 3, 6])\n&#091;10.5s] &#091;pool-1-thread-1 ] Calling deque.putLast(7) (deque = &#091;4, 3, 6])...\n&#091;11.5s] &#091;pool-1-thread-4 ] Calling deque.putFirst(8) (deque = &#091;4, 3, 6])...\n&#091;12.0s] &#091;pool-1-thread-5 ]     Calling deque.takeFirst() (deque = &#091;4, 3, 6])...\n&#091;12.0s] &#091;pool-1-thread-1 ] deque.putLast(7) returned (deque = &#091;3, 6, 7])\n&#091;12.0s] &#091;pool-1-thread-5 ]     deque.takeFirst() returned 4 (deque = &#091;3, 6, 7])\n&#091;12.5s] &#091;pool-1-thread-9 ] Calling deque.putFirst(9) (deque = &#091;3, 6, 7])...\n&#091;15.0s] &#091;pool-1-thread-3 ]     Calling deque.takeFirst() (deque = &#091;3, 6, 7])...\n&#091;15.0s] &#091;pool-1-thread-4 ] deque.putFirst(8) returned (deque = &#091;8, 6, 7])\n&#091;15.0s] &#091;pool-1-thread-3 ]     deque.takeFirst() returned 3 (deque = &#091;8, 6, 7])\n&#091;18.0s] &#091;pool-1-thread-7 ]     Calling deque.takeLast() (deque = &#091;8, 6, 7])...\n&#091;18.0s] &#091;pool-1-thread-7 ]     deque.takeLast() returned 7 (deque = &#091;9, 8, 6])\n&#091;18.0s] &#091;pool-1-thread-9 ] deque.putFirst(9) returned (deque = &#091;9, 8, 6])\n&#091;21.0s] &#091;pool-1-thread-6 ]     Calling deque.takeLast() (deque = &#091;9, 8, 6])...\n&#091;21.0s] &#091;pool-1-thread-6 ]     deque.takeLast() returned 6 (deque = &#091;9, 8])\n&#091;24.0s] &#091;pool-1-thread-8 ]     Calling deque.takeLast() (deque = &#091;9, 8])...\n&#091;24.0s] &#091;pool-1-thread-8 ]     deque.takeLast() returned 8 (deque = &#091;9])\n&#091;27.0s] &#091;pool-1-thread-10]     Calling deque.takeLast() (deque = &#091;9])...\n&#091;27.0s] &#091;pool-1-thread-10]     deque.takeLast() returned 9 (deque = &#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>Es ist zu Beginn gut zu sehen, wie die <code>takeLast()<\/code>- und <code>takeFirst()<\/code>-Aufrufe nach 0 s und 3 s an dem leeren Deque blockieren.<\/p>\n\n\n\n<p>Nach 3,5 s und 4,5 s schreiben wir Elemente in das Deque, die sofort von den vorab blockierten Methoden in Threads 1 und 4 wieder entnommen werden.<\/p>\n\n\n\n<p>Wir schreiben nun schneller als dass wir lesen, so dass nach 10,5 s Thread 1 beim Aufruf von <code>putLast()<\/code> und nach 11,5 s Thread 4 beim Aufruf von <code>putFirst()<\/code> am vollen Deque blockieren.<\/p>\n\n\n\n<p>Nach 12 s entnimmt Thread 5 ein Element, so dass Thread 1 fortfahren und das Deque wieder f\u00fcllen kann.<\/p>\n\n\n\n<p>Nach 12,5 s blockiert Thread 9 mit <code>putFirst()<\/code>, da das Deque nach wie vor (bzw. wieder) voll ist.<\/p>\n\n\n\n<p>Nach 15 s und 18 s entnehmen die Threads 3 und 7 jeweils ein Element, wodurch die blockierten Threads 4 und 9 wiederum ein Element einf\u00fcgen k\u00f6nnen.<\/p>\n\n\n\n<p>Danach werden (bei 21 s, 24 s und 27 s) die verbleibenden drei Elemente entnommen und keine neuen eingef\u00fcgt.<\/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 Teil der Tutorialserie hast du das auf einer verketteten Liste basierte, threadsichere, bounded und blockierende <code>LinkedBlockingDeque<\/code> und seine Eigenschaften kennengelernt.<\/p>\n\n\n\n<p>Das war die letzte von vier Deque-Implementierungen. Im n\u00e4chsten Teil gebe ich dir eine Entscheidungshilfe, <a href=\"\/de\/algorithmen\/java-deque-implementierungen\/\">wann du welche Deque-Implementierung einsetzten solltest<\/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":30774,"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 das Java LinkedBlockingDeque? Wie funktioniert es? Was sind seine Eigenschaften? Wann sollte man es 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":11029,"_post_count":0,"footnotes":""},"categories":[127],"tags":[195],"class_list":["post-30438","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-algorithmen","tag-datenstrukturen-deque"],"uagb_featured_image_src":{"full":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-1770x986-1.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/05\/LinkedBlockingQueue-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 LinkedBlockingQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?","public_identification_id":"1b64fbeeed274d45b82c3d62d9cf6d2c","private_identification_id":"e570f2d7ece44cabae060faf913d3f09","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30438","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=30438"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30438\/revisions"}],"predecessor-version":[{"id":41707,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/30438\/revisions\/41707"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/30774"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=30438"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=30438"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=30438"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}