{"id":379,"date":"2024-05-08T00:03:08","date_gmt":"2024-05-07T23:03:08","guid":{"rendered":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=379"},"modified":"2024-06-05T00:05:32","modified_gmt":"2024-06-04T23:05:32","slug":"die-linkedblockingqueue-in-java","status":"publish","type":"post","link":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/?p=379","title":{"rendered":"Die LinkedBlockingQueue in Java"},"content":{"rendered":"\n<p>Die <code>LinkedBlockingQueue<\/code> ist eine der Implementierungen der <code>BlockingQueue<\/code>-Schnittstelle in Java und geh\u00f6rt zu den am h\u00e4ufigsten verwendeten Datenstrukturen in Multi-Threading-Umgebungen. Sie kombiniert die Eigenschaften einer verlinkten Liste und einer Blocking Queue und bietet eine threadsichere Warteschlange mit optionaler Kapazit\u00e4tsgrenze. Dieser Artikel beleuchtet die grundlegenden Aspekte der <code>LinkedBlockingQueue<\/code>, ihre Verwendung und praktische Anwendungsbeispiele.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">1. Einf\u00fchrung in die <code>LinkedBlockingQueue<\/code><\/h4>\n\n\n\n<p>Die <code>LinkedBlockingQueue<\/code> befindet sich im Paket <code>java.util.concurrent<\/code>. Eine Blocking Queue ist eine spezielle Art von Warteschlange, die blockierende Operationen zum Einf\u00fcgen (<code>put<\/code>) und Entfernen (<code>take<\/code>) von Elementen unterst\u00fctzt. Diese Blockierungen sind n\u00fctzlich in Multi-Threaded-Anwendungen, bei denen Threads kooperativ arbeiten m\u00fcssen, indem sie auf die Verf\u00fcgbarkeit von Ressourcen warten oder diese teilen.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-1\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\"><span class=\"hljs-keyword\">import<\/span> java.util.concurrent.LinkedBlockingQueue;\n\npublic <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">LinkedBlockingQueueExample<\/span> <\/span>{\n    public <span class=\"hljs-keyword\">static<\/span> <span class=\"hljs-keyword\">void<\/span> main(<span class=\"hljs-built_in\">String<\/span>&#91;] args) {\n        LinkedBlockingQueue&lt;Integer&gt; queue = <span class=\"hljs-keyword\">new<\/span> LinkedBlockingQueue&lt;&gt;(<span class=\"hljs-number\">10<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ Einf\u00fcgen eines Elements<\/span>\n        queue.offer(<span class=\"hljs-number\">1<\/span>);\n\n        <span class=\"hljs-comment\">\/\/ Entfernen eines Elements<\/span>\n        <span class=\"hljs-keyword\">try<\/span> {\n            Integer value = queue.take();\n            System.out.println(<span class=\"hljs-string\">\"Entferntes Element: \"<\/span> + value);\n        } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n            e.printStackTrace();\n        }\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-1\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Im obigen Beispiel erstellen wir eine <code>LinkedBlockingQueue<\/code> mit einer Kapazit\u00e4t von 10 Elementen, f\u00fcgen ein Element hinzu und entfernen es wieder.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">2. Konstruktoren<\/h4>\n\n\n\n<p>Die <code>LinkedBlockingQueue<\/code> bietet mehrere Konstruktoren:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Default-Konstruktor<\/strong>: Erstellt eine unbegrenzte Warteschlange.<\/li>\n\n\n\n<li><strong>Kapazit\u00e4tsbegrenzter Konstruktor<\/strong>: Erstellt eine Warteschlange mit einer bestimmten maximalen Kapazit\u00e4t.<\/li>\n\n\n\n<li><strong>Kopierender Konstruktor<\/strong>: Erstellt eine Warteschlange, die die Elemente einer gegebenen Collection kopiert.<\/li>\n<\/ul>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-2\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">\/\/ Unbegrenzte Warteschlange\nLinkedBlockingQueue<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Integer<\/span>&gt;<\/span> unboundedQueue = new LinkedBlockingQueue<span class=\"hljs-tag\">&lt;&gt;<\/span>();\n\n\/\/ Warteschlange mit Kapazit\u00e4t 100\nLinkedBlockingQueue<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Integer<\/span>&gt;<\/span> boundedQueue = new LinkedBlockingQueue<span class=\"hljs-tag\">&lt;&gt;<\/span>(100);\n\n\/\/ Warteschlange aus einer bestehenden Sammlung\nCollection<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Integer<\/span>&gt;<\/span> collection = Arrays.asList(1, 2, 3, 4, 5);\nLinkedBlockingQueue<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Integer<\/span>&gt;<\/span> queueFromCollection = new LinkedBlockingQueue<span class=\"hljs-tag\">&lt;&gt;<\/span>(collection);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-2\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">3. Methoden<\/h4>\n\n\n\n<p>Die <code>LinkedBlockingQueue<\/code> bietet eine Vielzahl von Methoden zur Manipulation der Warteschlange:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Einf\u00fcgen von Elementen<\/strong>:<\/li>\n\n\n\n<li><code>add(E e)<\/code>: F\u00fcgt ein Element hinzu, wenn m\u00f6glich, und wirft eine <code>IllegalStateException<\/code>, wenn die Warteschlange voll ist.<\/li>\n\n\n\n<li><code>offer(E e)<\/code>: F\u00fcgt ein Element hinzu, wenn m\u00f6glich, und gibt <code>false<\/code> zur\u00fcck, wenn die Warteschlange voll ist.<\/li>\n\n\n\n<li><code>put(E e)<\/code>: F\u00fcgt ein Element hinzu und blockiert, wenn die Warteschlange voll ist.<\/li>\n\n\n\n<li><strong>Entfernen von Elementen<\/strong>:<\/li>\n\n\n\n<li><code>poll()<\/code>: Entfernt und liefert das Kopf-Element, oder <code>null<\/code>, wenn die Warteschlange leer ist.<\/li>\n\n\n\n<li><code>take()<\/code>: Entfernt und liefert das Kopf-Element und blockiert, wenn die Warteschlange leer ist.<\/li>\n\n\n\n<li><code>remove(Object o)<\/code>: Entfernt ein bestimmtes Element aus der Warteschlange.<\/li>\n\n\n\n<li><strong>Pr\u00fcfen der Warteschlange<\/strong>:<\/li>\n\n\n\n<li><code>peek()<\/code>: Liefert das Kopf-Element, ohne es zu entfernen, oder <code>null<\/code>, wenn die Warteschlange leer ist.<\/li>\n\n\n\n<li><code>isEmpty()<\/code>: Pr\u00fcft, ob die Warteschlange leer ist.<\/li>\n\n\n\n<li><code>size()<\/code>: Liefert die Anzahl der Elemente in der Warteschlange.<\/li>\n<\/ul>\n\n\n\n<p>Hier sind einige Beispiele zur Demonstration der wichtigsten Methoden:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-3\" data-shcb-language-name=\"JavaScript\" data-shcb-language-slug=\"javascript\"><span><code class=\"hljs language-javascript\">LinkedBlockingQueue&lt;Integer&gt; queue = <span class=\"hljs-keyword\">new<\/span> LinkedBlockingQueue&lt;&gt;(<span class=\"hljs-number\">5<\/span>);\n\n<span class=\"hljs-comment\">\/\/ Hinzuf\u00fcgen von Elementen<\/span>\nqueue.add(<span class=\"hljs-number\">1<\/span>);\nqueue.offer(<span class=\"hljs-number\">2<\/span>);\n\n<span class=\"hljs-keyword\">try<\/span> {\n    queue.put(<span class=\"hljs-number\">3<\/span>);\n} <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n    e.printStackTrace();\n}\n\n<span class=\"hljs-comment\">\/\/ \u00dcberpr\u00fcfen der Gr\u00f6\u00dfe<\/span>\nSystem.out.println(<span class=\"hljs-string\">\"Gr\u00f6\u00dfe der Warteschlange: \"<\/span> + queue.size()); <span class=\"hljs-comment\">\/\/ Ausgabe: 3<\/span>\n\n<span class=\"hljs-comment\">\/\/ Zugriff auf das Kopf-Element<\/span>\nSystem.out.println(<span class=\"hljs-string\">\"Kopf-Element: \"<\/span> + queue.peek()); <span class=\"hljs-comment\">\/\/ Ausgabe: 1<\/span>\n\n<span class=\"hljs-comment\">\/\/ Entfernen von Elementen<\/span>\nSystem.out.println(<span class=\"hljs-string\">\"Entferntes Element: \"<\/span> + queue.poll()); <span class=\"hljs-comment\">\/\/ Ausgabe: 1<\/span><\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-3\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">JavaScript<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">javascript<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<h4 class=\"wp-block-heading\">4. Blockierende Operationen<\/h4>\n\n\n\n<p>Die blockierenden Operationen der <code>LinkedBlockingQueue<\/code> sind besonders n\u00fctzlich in Producer-Consumer-Szenarien. Hier ein Beispiel, das zeigt, wie Producer- und Consumer-Threads mit einer <code>LinkedBlockingQueue<\/code> interagieren k\u00f6nnen:<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-4\" data-shcb-language-name=\"PHP\" data-shcb-language-slug=\"php\"><span><code class=\"hljs language-php\">import java.util.concurrent.LinkedBlockingQueue;\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Producer<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Runnable<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> LinkedBlockingQueue&lt;Integer&gt; queue;\n\n    <span class=\"hljs-keyword\">public<\/span> Producer(LinkedBlockingQueue&lt;Integer&gt; queue) {\n        this.queue = queue;\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void run() {\n        <span class=\"hljs-keyword\">try<\/span> {\n            <span class=\"hljs-keyword\">for<\/span> (int i = <span class=\"hljs-number\">0<\/span>; i &lt; <span class=\"hljs-number\">10<\/span>; i++) {\n                System.out.println(<span class=\"hljs-string\">\"Producing: \"<\/span> + i);\n                queue.put(i);\n                Thread.sleep(<span class=\"hljs-number\">100<\/span>); <span class=\"hljs-comment\">\/\/ Simuliert Produktionszeit<\/span>\n            }\n        } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n            Thread.currentThread().interrupt();\n        }\n    }\n}\n\n<span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">Consumer<\/span> <span class=\"hljs-keyword\">implements<\/span> <span class=\"hljs-title\">Runnable<\/span> <\/span>{\n    <span class=\"hljs-keyword\">private<\/span> <span class=\"hljs-keyword\">final<\/span> LinkedBlockingQueue&lt;Integer&gt; queue;\n\n    <span class=\"hljs-keyword\">public<\/span> Consumer(LinkedBlockingQueue&lt;Integer&gt; queue) {\n        this.queue = queue;\n    }\n\n    @Override\n    <span class=\"hljs-keyword\">public<\/span> void run() {\n        <span class=\"hljs-keyword\">try<\/span> {\n            <span class=\"hljs-keyword\">while<\/span> (<span class=\"hljs-keyword\">true<\/span>) {\n                Integer value = queue.take();\n                System.out.println(<span class=\"hljs-string\">\"Consuming: \"<\/span> + value);\n                Thread.sleep(<span class=\"hljs-number\">150<\/span>); <span class=\"hljs-comment\">\/\/ Simuliert Konsumzeit<\/span>\n            }\n        } <span class=\"hljs-keyword\">catch<\/span> (InterruptedException e) {\n            Thread.currentThread().interrupt();\n        }\n    }\n}\n\n<span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-class\"><span class=\"hljs-keyword\">class<\/span> <span class=\"hljs-title\">ProducerConsumerExample<\/span> <\/span>{\n    <span class=\"hljs-keyword\">public<\/span> <span class=\"hljs-keyword\">static<\/span> void main(String&#91;] args) {\n        LinkedBlockingQueue&lt;Integer&gt; queue = <span class=\"hljs-keyword\">new<\/span> LinkedBlockingQueue&lt;&gt;(<span class=\"hljs-number\">5<\/span>);\n\n        Producer producer = <span class=\"hljs-keyword\">new<\/span> Producer(queue);\n        Consumer consumer = <span class=\"hljs-keyword\">new<\/span> Consumer(queue);\n\n        Thread producerThread = <span class=\"hljs-keyword\">new<\/span> Thread(producer);\n        Thread consumerThread = <span class=\"hljs-keyword\">new<\/span> Thread(consumer);\n\n        producerThread.start();\n        consumerThread.start();\n    }\n}<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-4\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">PHP<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">php<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>In diesem Beispiel produziert der <code>Producer<\/code>-Thread kontinuierlich Elemente und f\u00fcgt sie der Warteschlange hinzu, w\u00e4hrend der <code>Consumer<\/code>-Thread diese Elemente aus der Warteschlange entfernt und konsumiert. Die blockierenden Methoden <code>put<\/code> und <code>take<\/code> sorgen daf\u00fcr, dass die Threads warten, wenn die Warteschlange voll oder leer ist, wodurch eine sichere und effiziente Koordination zwischen den Threads erm\u00f6glicht wird.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">5. Kapazit\u00e4tsmanagement und Thread-Sicherheit<\/h4>\n\n\n\n<p>Die <code>LinkedBlockingQueue<\/code> kann mit oder ohne Kapazit\u00e4tsbegrenzung verwendet werden. Wenn keine Kapazit\u00e4tsbegrenzung angegeben wird, verh\u00e4lt sich die Warteschlange wie eine unbeschr\u00e4nkte Warteschlange, was in Umgebungen mit unvorhersehbarem Lastaufkommen zu Problemen f\u00fchren kann. Die Begrenzung der Kapazit\u00e4t kann dazu beitragen, die Ressourcen zu verwalten und sicherzustellen, dass die Anwendung stabil bleibt.<\/p>\n\n\n<pre class=\"wp-block-code\" aria-describedby=\"shcb-language-5\" data-shcb-language-name=\"HTML, XML\" data-shcb-language-slug=\"xml\"><span><code class=\"hljs language-xml\">LinkedBlockingQueue<span class=\"hljs-tag\">&lt;<span class=\"hljs-name\">Integer<\/span>&gt;<\/span> limitedQueue = new LinkedBlockingQueue<span class=\"hljs-tag\">&lt;&gt;<\/span>(100);<\/code><\/span><small class=\"shcb-language\" id=\"shcb-language-5\"><span class=\"shcb-language__label\">Code-Sprache:<\/span> <span class=\"shcb-language__name\">HTML, XML<\/span> <span class=\"shcb-language__paren\">(<\/span><span class=\"shcb-language__slug\">xml<\/span><span class=\"shcb-language__paren\">)<\/span><\/small><\/pre>\n\n\n<p>Ein weiterer wichtiger Aspekt ist die Thread-Sicherheit. Die <code>LinkedBlockingQueue<\/code> verwendet interne Sperren (Locks) und Bedingungen (Conditions), um sicherzustellen, dass alle Operationen atomar und threadsicher sind. Dies bedeutet, dass mehrere Threads sicher auf dieselbe Warteschlange zugreifen k\u00f6nnen, ohne dass zus\u00e4tzliche Synchronisationsmechanismen erforderlich sind.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">6. Anwendungsbeispiele<\/h4>\n\n\n\n<p>Die <code>LinkedBlockingQueue<\/code> findet in vielen realen Anwendungen Einsatz, insbesondere dort, wo eine sichere und effiziente Kommunikation zwischen Threads erforderlich ist. Beispiele umfassen:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><strong>Log-Verarbeitungssysteme<\/strong>: Ein Producer-Thread schreibt Log-Meldungen in eine Warteschlange, w\u00e4hrend ein Consumer-Thread die Nachrichten aus der Warteschlange liest und verarbeitet.<\/li>\n\n\n\n<li><strong>Auftragsverarbeitung<\/strong>: In einem Webserver k\u00f6nnen Anfragen in eine Warteschlange gestellt werden, die von Worker-Threads verarbeitet wird.<\/li>\n\n\n\n<li><strong>Daten-Pipelines<\/strong>: In Datenverarbeitungssystemen k\u00f6nnen Daten von einem Schritt zum n\u00e4chsten durch eine Reihe von Warteschlangen weitergeleitet werden, wobei jeder Schritt von einem eigenen Thread oder Thread-Pool durchgef\u00fchrt wird.<\/li>\n<\/ul>\n\n\n\n<h4 class=\"wp-block-heading\">7. Fazit<\/h4>\n\n\n\n<p>Die <code>LinkedBlockingQueue<\/code> ist eine vielseitige und leistungsf\u00e4hige Datenstruktur in Java, die sich ideal f\u00fcr Multi-Threading-Szenarien eignet. Durch ihre blockierenden Operationen und die F\u00e4higkeit, eine Kapazit\u00e4tsgrenze zu setzen, bietet sie eine robuste L\u00f6sung f\u00fcr die Synchronisation und Kommunikation zwischen Threads. Ob in einfachen Producer-Consumer-Modellen oder komplexen Datenverarbeitungssystemen, die <code>LinkedBlockingQueue<\/code> ist ein unverzichtbares Werkzeug in der Toolbox eines Java-Entwicklers.<\/p>\n\n\n\n<p>Mit der richtigen Anwendung und einem guten Verst\u00e4ndnis der zugrunde liegenden Mechanismen kann die <code>LinkedBlockingQueue<\/code> dazu beitragen, Multi-Threaded-Anwendungen effizienter und stabiler zu gestalten.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Die LinkedBlockingQueue ist eine der Implementierungen der BlockingQueue-Schnittstelle in Java und geh\u00f6rt zu den am h\u00e4ufigsten verwendeten Datenstrukturen in Multi-Threading-Umgebungen. Sie kombiniert die Eigenschaften einer verlinkten Liste und einer Blocking Queue und bietet eine threadsichere Warteschlange mit optionaler Kapazit\u00e4tsgrenze. Dieser Artikel beleuchtet die grundlegenden Aspekte der LinkedBlockingQueue, ihre Verwendung und praktische Anwendungsbeispiele. 1. Einf\u00fchrung in [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"class_list":["post-379","post","type-post","status-publish","format-standard","hentry","category-plain_java"],"_links":{"self":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/379","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=379"}],"version-history":[{"count":1,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/379\/revisions"}],"predecessor-version":[{"id":380,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=\/wp\/v2\/posts\/379\/revisions\/380"}],"wp:attachment":[{"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=379"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=379"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.xn--javaeinfacherklrt-4qb.de\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=379"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}