{"id":29100,"date":"2022-04-20T17:11:34","date_gmt":"2022-04-20T15:11:34","guid":{"rendered":"https:\/\/www.happycoders.eu\/?p=29100"},"modified":"2024-11-27T15:09:41","modified_gmt":"2024-11-27T14:09:41","slug":"linkedtransferqueue-java","status":"publish","type":"post","link":"https:\/\/www.happycoders.eu\/de\/algorithmen\/linkedtransferqueue-java\/","title":{"rendered":"LinkedTransferQueue in Java (mit Beispiel)"},"content":{"rendered":"\n<p class=\"wp-block-paragraph\">In diesem Artikel lernst du eine sehr spezielle Queue kennen: die <code>LinkedTransferQueue<\/code>. Dieser Artikel beschreibt deren Eigenschaften und zeigt dir anhand eines Beispiels, wie du diese Queue einsetzt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Wir befinden uns nunmehr am untersten Punkt der Queue-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\/LinkedTransferQueue-class-hierarchy-800x500.png\" alt=\"LinkedTransferQueue in der Klassenhierarchie\" class=\"wp-image-29101\" srcset=\"https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedTransferQueue-class-hierarchy-800x500.png 800w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedTransferQueue-class-hierarchy-224x140.png 224w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedTransferQueue-class-hierarchy-336x210.png 336w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedTransferQueue-class-hierarchy-504x315.png 504w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedTransferQueue-class-hierarchy-672x420.png 672w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedTransferQueue-class-hierarchy-400x250.png 400w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedTransferQueue-class-hierarchy-600x375.png 600w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedTransferQueue-class-hierarchy-944x590.png 944w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedTransferQueue-class-hierarchy-1200x750.png 1200w, https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/LinkedTransferQueue-class-hierarchy.png 1600w\" sizes=\"(max-width: 800px) 100vw, 800px\" \/><figcaption>LinkedTransferQueue in der Klassenhierarchie<\/figcaption><\/figure><\/div>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"transferqueue-interface\">TransferQueue Interface<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Wie im Klassendiagram gut zu erkennen ist, ist <code>java.util.concurrent.LinkedTransferQueue<\/code> die einzige Klasse, die das Interface <code>TransferQueue<\/code> implementiert.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\"><code>TransferQueue<\/code> definiert zus\u00e4tzliche Enqueue-Methoden, die nur dann erfolgreich ausgef\u00fchrt werden k\u00f6nnen, wenn ein anderer Thread mit <code>take()<\/code> oder <code>poll()<\/code> das \u00fcbergebe Element entgegennimmt:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li><code>transfer(E e)<\/code> \u2013 \u00fcbermittelt das Element an einen Thread, der mit <code>take()<\/code> oder <code>poll()<\/code> auf ein Element wartet. Wenn solch ein Thread nicht existiert, blockiert die Methode solange, bis ein anderer Thread <code>take()<\/code> oder <code>poll()<\/code> aufruft.<\/li><li><code>tryTransfer(E e)<\/code> \u2013 \u00fcbermittelt das Element an einen Thread, der mit <code>take()<\/code> oder <code>poll()<\/code> auf ein Element wartet. Wenn solch ein Thread nicht existiert, gibt die Methode umgehend <code>false<\/code> zur\u00fcck.<\/li><li><code>tryTransfer(E e, long timeout, TimeUnit unit)<\/code> \u2013 \u00fcbermittelt das Element an einen Thread, der mit <code>take()<\/code> oder <code>poll()<\/code> auf ein Element wartet. Wenn solch ein Thread nicht existiert und auch nicht innerhalb der Wartezeit erscheint, gibt die Methode <code>false<\/code> zur\u00fcck.<\/li><\/ul>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"linkedtransferqueue-eigenschaften\">LinkedTransferQueue Eigenschaften<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Bei der <code>LinkedTransferQueue<\/code> handelt es sich um eine unbounded blocking Queue, d. h. die regul\u00e4ren Enqueue-Operationen <code>put()<\/code> und <code>offer()<\/code> k\u00f6nnen nicht blockieren (da die Queue beliebig gro\u00df werden kann). Blockieren k\u00f6nnen hingegen:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>die Dequeue-Operationen (wenn die Queue leer ist) <\/li><li>und die <code>transfer()<\/code>- bzw. <code>tryTransfer()<\/code>-Methoden des <code>TransferQueue<\/code>-Interfaces, bis die jeweiligen Elemente entnommen werden.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\"><code>LinkedTransferQueue<\/code> basiert auf einer einfach verketteten Liste. Das hat zur Folge, dass die Zeitkomplexit\u00e4t der <code>size()<\/code>-Methode <em>O(n)<\/em> betr\u00e4gt\u00b9 (und nicht <em>O(1)<\/em> wie bei den Array-basierten Queues), da zum Bestimmen der L\u00e4nge die komplette Liste abgelaufen werden muss.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Threadsicherheit wird durch nicht-blockierende Compare-and-set (CAS)-Operationen erreicht, was eine hohe Performance bei niedriger bis moderater Contention (Zugriffskonflikten durch mehrere Threads) sicherstellt.<\/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\">Verkettete Liste<\/td><td class=\"has-text-align-center\" data-align=\"center\">Ja<br><span style=\"font-size:90%\">(optimistisches Locking durch Compare-and-set)<\/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\">Unbounded<\/td><td class=\"has-text-align-center\" data-align=\"center\">Weakly consistent\u00b2<\/td><\/tr><\/tbody><\/table><\/figure>\n\n\n\n<p class=\"hc-footnote wp-block-paragraph\">\u00b9 Alles \u00fcber Zeitkomplexit\u00e4t erf\u00e4hrst du im Artikel \"<a href=\"\/de\/algorithmen\/o-notation-zeitkomplexitaet\/\">O-Notation und Zeitkomplexit\u00e4t \u2013 anschaulich erkl\u00e4rt<\/a>\"<\/p>\n\n\n\n<p class=\"hc-footnote wp-block-paragraph\">\u00b2 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>LinkedTransferQueue<\/code> wird im JDK nicht verwendet. Urspr\u00fcnglich wurde sie f\u00fcr das im JDK 7 eingef\u00fchrte Fork\/Join-Framework implementiert, dann aber noch nicht daf\u00fcr genutzt. Die Wahrscheinlichkeit von Bugs ist daher recht hoch, so dass du auf den Einsatz dieser Klasse verzichten solltest.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"linkedtransferqueue-beispiel\">LinkedTransferQueue Beispiel<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Im folgenden Beispiel (\u2192 <a href=\"https:\/\/github.com\/SvenWoltmann\/java-collections-guide\/blob\/main\/src\/main\/java\/eu\/happycoders\/demos\/queue\/LinkedTransferQueueExample.java\" target=\"_blank\" rel=\"noopener\">Code auf GitHub<\/a>) werden zwei Threads gestartet, die <code>LinkedTransferQueue.transfer()<\/code> aufrufen. Danach wird ein Element direkt in die Queue geschrieben. Dann werden zwei weitere Threads gestartet, die <code>transfer()<\/code> aufrufen. Abschlie\u00dfend werden solange Elemente aus der Queue entnommen, bis diese wieder leer ist.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"Java\" data-shcb-language-slug=\"java\"><span><code class=\"hljs language-java\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">LinkedTransferQueueExample<\/span> <\/span>{\n  <span class=\"hljs-function\"><span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> <span class=\"hljs-title\">main<\/span><span class=\"hljs-params\">(String&#091;] args)<\/span> <span class=\"hljs-keyword\">throws<\/span> InterruptedException <\/span>{\n    TransferQueue&lt;Integer&gt; queue = <span class=\"hljs-keyword\">new<\/span> LinkedTransferQueue&lt;&gt;();\n\n    <span class=\"hljs-comment\">\/\/ Start 2 threads calling queue.transfer(),<\/span>\n    startTransferThread(queue, <span class=\"hljs-number\">1<\/span>);\n    startTransferThread(queue, <span class=\"hljs-number\">2<\/span>);\n\n    <span class=\"hljs-comment\">\/\/ ... then put one element directly,<\/span>\n    enqueueViaPut(queue, <span class=\"hljs-number\">3<\/span>);\n\n    <span class=\"hljs-comment\">\/\/ ... then start 2 more threads calling queue.transfer().<\/span>\n    startTransferThread(queue, <span class=\"hljs-number\">4<\/span>);\n    startTransferThread(queue, <span class=\"hljs-number\">5<\/span>);\n\n    <span class=\"hljs-comment\">\/\/ Now take all elements until the queue is empty<\/span>\n    <span class=\"hljs-keyword\">while<\/span> (!queue.isEmpty()) {\n      dequeueViaTake(queue);\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\">startTransferThread<\/span><span class=\"hljs-params\">(TransferQueue&lt;Integer&gt; queue, <span class=\"hljs-keyword\">int<\/span> element)<\/span>\n      <span class=\"hljs-keyword\">throws<\/span> InterruptedException <\/span>{\n    <span class=\"hljs-keyword\">new<\/span> Thread(() -&gt; enqueueViaTransfer(queue, element)).start();\n\n    <span class=\"hljs-comment\">\/\/ Wait a bit to let the thread enqueue the element<\/span>\n    Thread.sleep(<span class=\"hljs-number\">100<\/span>);\n    log(<span class=\"hljs-string\">\"                            --&gt; queue = \"<\/span> + queue);\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\">enqueueViaTransfer<\/span><span class=\"hljs-params\">(TransferQueue&lt;Integer&gt; queue, <span class=\"hljs-keyword\">int<\/span> element)<\/span> <\/span>{\n    log(<span class=\"hljs-string\">\"Calling queue.transfer(%d)...\"<\/span>, element);\n    <span class=\"hljs-keyword\">try<\/span> {\n      queue.transfer(element);\n      log(<span class=\"hljs-string\">\"queue.transfer(%d) returned  --&gt; 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\">enqueueViaPut<\/span><span class=\"hljs-params\">(TransferQueue&lt;Integer&gt; queue, <span class=\"hljs-keyword\">int<\/span> element)<\/span>\n      <span class=\"hljs-keyword\">throws<\/span> InterruptedException <\/span>{\n    log(<span class=\"hljs-string\">\"Calling queue.put(%d)...\"<\/span>, element);\n    queue.put(element);\n    log(<span class=\"hljs-string\">\"queue.put(%d) returned       --&gt; queue = %s\"<\/span>, element, queue);\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\">dequeueViaTake<\/span><span class=\"hljs-params\">(TransferQueue&lt;Integer&gt; queue)<\/span>\n      <span class=\"hljs-keyword\">throws<\/span> InterruptedException <\/span>{\n    log(<span class=\"hljs-string\">\"    Calling queue.take() (queue = %s)...\"<\/span>, queue);\n    Integer e = queue.take();\n    log(<span class=\"hljs-string\">\"    queue.take() returned %d --&gt; queue = %s\"<\/span>, e, queue);\n\n    <span class=\"hljs-comment\">\/\/ Wait a bit to get the log output in a readable order<\/span>\n    Thread.sleep(<span class=\"hljs-number\">10<\/span>);\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, <span class=\"hljs-string\">\"&#091;%-8s] %s%n\"<\/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 die 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;Thread-0] Calling queue.transfer(1)...\n&#091;main    ]                             --&gt; queue = &#091;1]\n&#091;Thread-1] Calling queue.transfer(2)...\n&#091;main    ]                             --&gt; queue = &#091;1, 2]\n&#091;main    ] Calling queue.put(3)...\n&#091;main    ] queue.put(3) returned       --&gt; queue = &#091;1, 2, 3]\n&#091;Thread-2] Calling queue.transfer(4)...\n&#091;main    ]                             --&gt; queue = &#091;1, 2, 3, 4]\n&#091;Thread-3] Calling queue.transfer(5)...\n&#091;main    ]                             --&gt; queue = &#091;1, 2, 3, 4, 5]\n&#091;main    ]     Calling queue.take() (queue = &#091;1, 2, 3, 4, 5])...\n&#091;main    ]     queue.take() returned 1 --&gt; queue = &#091;2, 3, 4, 5]\n&#091;Thread-0] queue.transfer(1) returned  --&gt; queue = &#091;2, 3, 4, 5]\n&#091;main    ]     Calling queue.take() (queue = &#091;2, 3, 4, 5])...\n&#091;main    ]     queue.take() returned 2 --&gt; queue = &#091;3, 4, 5]\n&#091;Thread-1] queue.transfer(2) returned  --&gt; queue = &#091;3, 4, 5]\n&#091;main    ]     Calling queue.take() (queue = &#091;3, 4, 5])...\n&#091;main    ]     queue.take() returned 3 --&gt; queue = &#091;4, 5]\n&#091;main    ]     Calling queue.take() (queue = &#091;4, 5])...\n&#091;main    ]     queue.take() returned 4 --&gt; queue = &#091;5]\n&#091;Thread-2] queue.transfer(4) returned  --&gt; queue = &#091;5]\n&#091;main    ]     Calling queue.take() (queue = &#091;5])...\n&#091;main    ]     queue.take() returned 5 --&gt; queue = &#091;]\n&#091;Thread-3] queue.transfer(5) returned  --&gt; 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\">Man sieht sehr sch\u00f6n, wie zu Beginn zwei mal <code>transfer()<\/code> aufgerufen wird (aber nicht zur\u00fcckkehrt), wie dann einmal <code>put()<\/code> aufgerufen wird (und zur\u00fcckkehrt) und wie noch zwei mal <code>transfer()<\/code> aufgerufen wird (und nicht zur\u00fcckkehrt).<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Danach sehen wir, wie das erste Element entnommen wird und daraufhin auch <code>transfer(1)<\/code> zur\u00fcckkehrt.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Dann wird das zweite Element entnommen und <code>transfer(2)<\/code> kehrt zur\u00fcck.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Die Entnahme der 3 f\u00fchrt zu keiner weiteren Aktion, da diese mit <code>put()<\/code> in die Queue geschrieben wurde.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nach der Entnahme der 4 und der 5 sieht man wieder sch\u00f6n, wie der jeweils zugeh\u00f6rige <code>transfer()<\/code>-Aufruf zur\u00fcckkehrt. <\/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 das <code>TransferQueue<\/code>-Interface und die <code>LinkedTransferQueue<\/code>-Implementierung kennengelernt und an einem Beispiel gesehen, wie man diese einsetzen kann.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Im n\u00e4chsten Teil dieser Tutorialserie findest du eine <a href=\"\/de\/algorithmen\/java-queue-implementierungen\/\">Zusammenfassung aller Queue-Implementierungen<\/a> des JDK und eine \u00dcbersicht, in welchen F\u00e4llen du welche Implementierung verwenden solltest.<\/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 LinkedTransferQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?<\/p>\n","protected":false},"author":1,"featured_media":29389,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_seopress_titles_title":"","_seopress_titles_desc":"Wie benutzt man die Java LinkedTransferQueue? 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":"LinkedTransferQueue","_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":8219,"_post_count":0,"footnotes":""},"categories":[127],"tags":[192],"class_list":["post-29100","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\/city-1940691-1770x986-1.jpg",1770,986,false],"thumbnail":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1.jpg",150,84,false],"medium":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1.jpg",300,167,false],"medium_large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1.jpg",768,428,false],"large":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1.jpg",1024,570,false],"feature_thumb_224":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1-224x125.jpg",224,125,true],"feature_thumb_336":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1-336x187.jpg",336,187,true],"feature_thumb_504":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1-504x281.jpg",504,281,true],"feature_thumb_672":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1-672x374.jpg",672,374,true],"half_400":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1-400x223.jpg",400,223,true],"half_600":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1-600x334.jpg",600,334,true],"full_800":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1-800x446.jpg",800,446,true],"full_944":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1-944x526.jpg",944,526,true],"full_1200":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1-1200x668.jpg",1200,668,true],"wide_1180":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1-1180x490.jpg",1180,490,true],"wide_1770":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1-1770x735.jpg",1770,735,true],"1536x1536":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-1770x986-1.jpg",1536,856,false],"2048x2048":["https:\/\/www.happycoders.eu\/wp-content\/uploads\/2022\/04\/city-1940691-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 LinkedTransferQueue? Wie funktioniert sie? Was sind ihre Eigenschaften? Wann sollte man sie einsetzen?","public_identification_id":"39850a2c89784b24a388b6615fefda88","private_identification_id":"d8c1b0b0e9e1491d8a891fab6f8e7d9a","_links":{"self":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29100","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=29100"}],"version-history":[{"count":10,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29100\/revisions"}],"predecessor-version":[{"id":41709,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/posts\/29100\/revisions\/41709"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media\/29389"}],"wp:attachment":[{"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/media?parent=29100"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/categories?post=29100"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.happycoders.eu\/de\/wp-json\/wp\/v2\/tags?post=29100"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}