{"id":3138,"date":"2022-06-15T05:27:58","date_gmt":"2022-06-15T05:27:58","guid":{"rendered":"http:\/\/the-codest.localhost\/blog\/concurrency-in-java-part-1-introduction\/"},"modified":"2026-03-11T05:59:41","modified_gmt":"2026-03-11T05:59:41","slug":"gelijktijdigheid-in-java-deel-1-inleiding","status":"publish","type":"post","link":"https:\/\/thecodest.co\/nl\/blog\/concurrency-in-java-part-1-introduction\/","title":{"rendered":"Concurrency in Java Deel 1 - Inleiding"},"content":{"rendered":"<p>In het algemeen is de conventionele programmeeraanpak sequentieel. Alles in een programma gebeurt stap voor stap.<br>Maar in feite draait de hele wereld parallel - het is de mogelijkheid om meer dan \u00e9\u00e9n taak tegelijkertijd uit te voeren.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Draad vs. proces<\/h2>\n\n\n\n<p>Om geavanceerde onderwerpen te bespreken zoals <strong>gelijktijdigheid in <a href=\"https:\/\/thecodest.co\/nl\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> of multithreading, moeten we het eens worden over enkele gemeenschappelijke definities om er zeker van te zijn dat we op dezelfde pagina zitten.<\/p>\n\n\n\n<p>Laten we beginnen met de basis. In de niet-sequenti\u00eble wereld hebben we twee soorten concurrency representanten: processen en<br>threads. Een proces is een instantie van het programma dat draait. Normaal gesproken is het ge\u00efsoleerd van andere processen.<br>Het besturingssysteem is verantwoordelijk voor het toewijzen van bronnen aan elk proces. Bovendien fungeert het als een geleider die<br>plant en controleert ze.<\/p>\n\n\n\n<p>Thread is een soort proces, maar op een lager niveau, daarom wordt het ook wel light thread genoemd. Meerdere threads kunnen in \u00e9\u00e9n<br>proces. Hier fungeert het programma als een scheduler en een controller voor threads. Op deze manier lijkt het alsof individuele programma's<br>meerdere taken tegelijkertijd.<\/p>\n\n\n\n<p>Het fundamentele verschil tussen threads en processen is het isolatieniveau. Het proces heeft zijn eigen set van<br>bronnen, terwijl de thread <a href=\"https:\/\/thecodest.co\/nl\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">gegevens<\/a> met andere threads. Het lijkt misschien een foutgevoelige aanpak en dat is het ook. Voor<br>Laten we ons daar nu niet op richten, want dat valt buiten het bestek van dit artikel.<\/p>\n\n\n\n<p>Processen, threads - ok... Maar wat is concurrency precies? Concurrency betekent dat je meerdere taken tegelijk kunt uitvoeren.<br>tijd. Het betekent niet dat die taken gelijktijdig moeten worden uitgevoerd - dat is wat parallellisme is. <strong>Concurrenc in Javay<\/strong> ook niet<br>meerdere CPU's of zelfs meerdere cores nodig. Het kan worden bereikt in een single-core omgeving door gebruik te maken van<br>contextschakelen.<\/p>\n\n\n\n<p>Een term die gerelateerd is aan concurrency is multithreading. Dit is een eigenschap van programma's waarmee ze meerdere taken tegelijk kunnen uitvoeren. Niet elk programma gebruikt deze aanpak, maar de programma's die dat wel doen, kunnen multithreaded worden genoemd.<\/p>\n\n\n\n<p>We zijn bijna klaar, nog \u00e9\u00e9n definitie. Asynchronie betekent dat een programma niet-blokkerende bewerkingen uitvoert.<br>Het start een taak en gaat dan verder met andere dingen terwijl het wacht op het antwoord. Als het antwoord komt, kan het <a href=\"https:\/\/thecodest.co\/nl\/blog\/react-development-all-you-have-to-know\/\">reageren<\/a> aan.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Al die jazz<\/h2>\n\n\n\n<p>Standaard wordt elke <strong>Java-toepassing<\/strong> draait in \u00e9\u00e9n proces. In dat proces is er \u00e9\u00e9n thread gerelateerd aan de <code>hoofd()<\/code> methode van<br>een applicatie. Zoals gezegd is het echter mogelijk om gebruik te maken van de mechanismen van meerdere threads binnen \u00e9\u00e9n<br>programma.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Runnable<\/h3>\n\n\n\n<p><code>Draad<\/code> is een <strong>Java<\/strong> klasse waarin de magie gebeurt. Dit is de objectrepresentatie van de eerder genoemde thread. Naar<br>je eigen thread maken, kun je de <code>Draad<\/code> klasse. Het is echter geen aanbevolen aanpak. <code>Draden<\/code> moet worden gebruikt als een mechanisme om de taak uit te voeren. Taken zijn stukjes <a href=\"https:\/\/thecodest.co\/nl\/dictionary\/what-is-code-refactoring\/\">code<\/a> die we in een gelijktijdige modus willen uitvoeren. We kunnen ze defini\u00ebren met de <code>Runnable<\/code> interface.<\/p>\n\n\n\n<p>Maar genoeg theorie, laten we de daad bij het woord voegen.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Probleem<\/h3>\n\n\n\n<p>Stel dat we een aantal matrices met getallen hebben. Voor elke matrix willen we de som van de getallen in een matrix weten. Laten we<br>doen alsof er veel van zulke arrays zijn en elk ervan relatief groot is. In dergelijke omstandigheden willen we gebruik maken van concurrency en elke array als een aparte taak optellen.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">int[] a1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\nint[] a2 = {10, 10, 10, 10, 10, 10, 10};\nint[] a3 = {3, 4, 3, 4, 3, 4, 2, 1, 3, 7};\n\nRunnable task1 = () -&gt; {\n    int sum = Arrays.stream(a1).sum();\n    System.out.println(\"1. De som is: \" + som);\n};\n\nRunnable task2 = () -&gt; {\n    int sum = Arrays.stream(a2).sum();\n    System.out.println(\"2. De som is: \" + som);\n};\n\nRunnable task3 = () -&gt; {\n    int sum = Arrays.stream(a3).sum();\n    System.out.println(\"3. De som is: \" + som);\n};\n\nnew Thread(task1).start();\nnieuwe Thread(task2).start();\nnieuwe Thread(task3).start();<\/code><\/pre>\n\n\n\n<p>Zoals je kunt zien in de bovenstaande code <code>Runnable<\/code> is een functionele interface. Het bevat \u00e9\u00e9n abstracte methode <code>uitvoeren()<\/code><br>zonder argumenten. De <code>Runnable<\/code> interface moet ge\u00efmplementeerd worden door elke klasse waarvan de instanties bedoeld zijn om<br>uitgevoerd door een thread.<\/p>\n\n\n\n<p>Zodra je een taak hebt gedefinieerd, kun je een thread maken om de taak uit te voeren. Dit kan via <code>nieuwe draad()<\/code> constructor die<br>neemt <code>Runnable<\/code> als argument.<\/p>\n\n\n\n<p>De laatste stap is <code>start()<\/code> een nieuw aangemaakte draad. In de <a href=\"https:\/\/thecodest.co\/nl\/blog\/compare-staff-augmentation-firms-that-excel-in-api-team-staffing-for-financial-technology-projects\/\">API<\/a> er zijn ook <code>uitvoeren()<\/code> methoden in <code>Runnable<\/code> en in<br><code>Draad<\/code>. Dat is echter geen manier om gebruik te maken van concurrency in Java. Een directe aanroep naar elk van deze methoden resulteert in<br>de taak uitvoeren in dezelfde thread als de <code>hoofd()<\/code> methode wordt uitgevoerd.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Draadpools en uitvoerders<\/h3>\n\n\n\n<p>Als er veel taken zijn, is het geen goed idee om voor elke taak een aparte thread aan te maken. Een <code>Draad<\/code> is een<br>en het is veel beter om bestaande threads te hergebruiken dan om nieuwe te maken.<\/p>\n\n\n\n<p>Als een programma veel kortstondige threads aanmaakt, is het beter om een threadpool te gebruiken. De threadpool bevat een aantal<br>threads die klaar zijn om te worden uitgevoerd, maar momenteel niet actief zijn. Een <code>Runnable<\/code> naar de pool zorgt ervoor dat een van de threads de<br><code>uitvoeren()<\/code> methode van gegeven <code>Runnable<\/code>. Na het voltooien van een taak bestaat de thread nog steeds en bevindt zich in een inactieve toestand.<\/p>\n\n\n\n<p>Ok, je snapt het - liever een threadpool dan handmatig aanmaken. Maar hoe kun je threadpools gebruiken? De <code>Executeurs<\/code><br>klasse heeft een aantal statische fabrieksmethoden voor het bouwen van threadpools. Bijvoorbeeld <code>nieuweCachedThredPool()<\/code> cre\u00ebert<br>een pool waarin nieuwe threads worden aangemaakt als dat nodig is en niet-actieve threads 60 seconden worden vastgehouden. In tegenstelling,<br><code>newFixedThreadPool()<\/code> bevat een vaste set threads, waarin idle threads voor onbepaalde tijd worden bewaard.<\/p>\n\n\n\n<p>Laten we eens kijken hoe het in ons voorbeeld zou kunnen werken. Nu hoeven we threads niet handmatig aan te maken. In plaats daarvan moeten we<br><code>UitvoerderService<\/code> die zorgt voor een pool van threads. Vervolgens kunnen we er taken aan toewijzen. De laatste stap is het sluiten van de thread<br>pool om geheugenlekken te voorkomen. De rest van de vorige code blijft hetzelfde.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">ExecutorService executor = Executors.newCachedThreadPool();\n\nexecutor.submit(task1);\nexecutor.submit(task2);\nexecutor.submit(task3);\n\nexecutor.shutdown();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Opvraagbaar<\/h3>\n\n\n\n<p><code>Runnable<\/code> lijkt een handige manier om gelijktijdige taken te maken, maar het heeft \u00e9\u00e9n grote tekortkoming. Het kan geen<br>waarde. Bovendien kunnen we niet bepalen of een taak voltooid is of niet. We weten ook niet of de taak is voltooid<br>normaal of uitzonderlijk. De oplossing voor deze kwalen is <code>Opvraagbaar<\/code>.<\/p>\n\n\n\n<p><code>Opvraagbaar<\/code> is vergelijkbaar met <code>Runnable<\/code> op een bepaalde manier ook asynchrone taken. Het belangrijkste verschil is dat het in staat is om<br>een waarde teruggeven. De retourwaarde kan van elk (niet-primitief) type zijn als de <code>Opvraagbaar<\/code> interface is een geparametriseerd type.<br><code>Opvraagbaar<\/code> is een functionele interface die <code>oproep()<\/code> methode die een <code>Uitzondering<\/code>.<\/p>\n\n\n\n<p>Laten we nu eens kijken hoe we gebruik kunnen maken van <code>Opvraagbaar<\/code> in ons matrixprobleem.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">int[] a1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\nint[] a2 = {10, 10, 10, 10, 10, 10, 10};\nint[] a3 = {3, 4, 3, 4, 3, 4, 2, 1, 3, 7};\n\nCallable task1 = () -&gt; Arrays.stream(a1).sum();\nCallable task2 = () -&gt; Arrays.stream(a2).som();\nCallable task3 = () -&gt; Arrays.stream(a3).som();\n\nExecutorService executor = Executors.newCachedThreadPool();\nFuture future1 = executor.submit(task1);\nFuture future2 = executor.submit(task2);\nFuture future3 = executor.submit(task3);\n\nSystem.out.println(\"1. De som is: \" + future1.get());\nSystem.out.println(\"2. De som is: \" + future2.get());\nSystem.out.println(\"3. De som is: \" + future3.get());\n\nexecutor.shutdown();<\/code><\/pre>\n\n\n\n<p>Ok\u00e9, we kunnen zien hoe <code>Opvraagbaar<\/code> wordt gemaakt en vervolgens ingediend bij <code>UitvoerderService<\/code>. Maar wat is <code>Toekomst<\/code>?<br><code>Toekomst<\/code> fungeert als een brug tussen threads. De som van elke array wordt geproduceerd in een aparte thread en we hebben een manier nodig om<br>die resultaten terugsturen naar <code>hoofd()<\/code>.<\/p>\n\n\n\n<p>Om het resultaat op te halen uit <code>Toekomst<\/code> moeten we bellen <code>krijgen()<\/code> methode. Hier kunnen twee dingen gebeuren. Ten eerste wordt de<br>resultaat van de berekening uitgevoerd door <code>Opvraagbaar<\/code> beschikbaar is. Dan krijgen we het onmiddellijk. Ten tweede is het resultaat niet<br>nog niet klaar. In dat geval <code>krijgen()<\/code> methode zal blokkeren totdat het resultaat beschikbaar is.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">ComputableFuture<\/h3>\n\n\n\n<p>Het probleem met <code>Toekomst<\/code> is dat het werkt in het 'push-paradigma'. Bij gebruik van <code>Toekomst<\/code> je moet zijn als een baas die<br>vraagt voortdurend: \"Is je taak klaar? Is het klaar?\" totdat het resultaat oplevert. Handelen onder constante druk is<br>duur. Een veel betere aanpak zou zijn om <code>Toekomst<\/code> wat te doen als het klaar is met zijn taak. Helaas,<br><code>Toekomst<\/code> kan dat niet doen, maar <code>ComputableFuture<\/code> kan.<\/p>\n\n\n\n<p><code>ComputableFuture<\/code> werkt in het 'pull-paradigma'. We kunnen het vertellen wat te doen met het resultaat wanneer het zijn taken heeft voltooid. Het<br>is een voorbeeld van een asynchrone aanpak.<\/p>\n\n\n\n<p><code>ComputableFuture<\/code> werkt perfect met <code>Runnable<\/code> maar niet met <code>Opvraagbaar<\/code>. In plaats daarvan is het mogelijk om een taak te leveren aan<br><code>ComputableFuture<\/code> in de vorm van <code>Leverancier<\/code>.<\/p>\n\n\n\n<p>Laten we eens kijken hoe het bovenstaande verband houdt met ons probleem.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">int[] a1 = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};\nint[] a2 = {10, 10, 10, 10, 10, 10, 10};\nint[] a3 = {3, 4, 3, 4, 3, 4, 2, 1, 3, 7};\n\nCompletableFuture.supplyAsync() -&gt; Arrays.stream(a1).sum())\n                .thenAccept(System.out::println);\n\nCompletableFuture.supplyAsync() -&gt; Arrays.stream(a2).sum())\n                .thenAccept(System.out::println);\n\nCompletableFuture.supplyAsync() -&gt; Arrays.stream(a3).sum())\n                .thenAccept(System.out::println);<\/code><\/pre>\n\n\n\n<p>Het eerste wat opvalt is hoeveel korter deze oplossing is. Daarnaast ziet het er ook nog eens netjes en opgeruimd uit.<\/p>\n\n\n\n<p>Taak naar <code>InvulbaarToekomst<\/code> kan worden geleverd door <code>supplyAsync()<\/code> methode die <code>Leverancier<\/code> of door <code>runAsync()<\/code> dat<br>neemt <code>Runnable<\/code>. Een callback - een stukje code dat moet worden uitgevoerd na het voltooien van een taak - wordt gedefinieerd door <code>thenAccept()<\/code><br>methode.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusies<\/h2>\n\n\n\n<p><strong>Java<\/strong> biedt veel verschillende benaderingen van gelijktijdigheid. In dit artikel hebben we het onderwerp nauwelijks aangestipt.<\/p>\n\n\n\n<p>Niettemin hebben we de basisbeginselen van <code>Draad<\/code>, <code>Runnable<\/code>, <code>Opvraagbaar<\/code>en <code>CallableFuture<\/code> wat een goed punt is<br>voor verder onderzoek.<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><a href=\"https:\/\/thecodest.co\/contact\/\"><img loading=\"lazy\" decoding=\"async\" width=\"1283\" height=\"460\" src=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_.png\" alt=\"\" class=\"wp-image-4927\" srcset=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_.png 1283w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-300x108.png 300w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-1024x367.png 1024w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-768x275.png 768w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-18x6.png 18w, https:\/\/thecodest.co\/app\/uploads\/2024\/05\/interested_in_cooperation_-67x24.png 67w\" sizes=\"auto, (max-width: 1283px) 100vw, 1283px\" \/><\/a><\/figure>","protected":false},"excerpt":{"rendered":"<p>Lees het eerste deel van onze blogserie over concurrency in Java. In het volgende artikel gaan we dieper in op de verschillen tussen threads en processen, thread pools, executors en nog veel meer!<\/p>","protected":false},"author":2,"featured_media":3139,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"inline_featured_image":false,"footnotes":""},"categories":[8],"tags":[],"class_list":["post-3138","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-software-development"],"acf":[],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v27.3 (Yoast SEO v27.3) - https:\/\/yoast.com\/product\/yoast-seo-premium-wordpress\/ -->\n<title>Concurrency in Java Part 1 - Introduction - The Codest<\/title>\n<meta name=\"description\" content=\"Read the first part of our blog series devoted to concurrency in Java.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/thecodest.co\/nl\/blog\/gelijktijdigheid-in-java-deel-1-inleiding\/\" \/>\n<meta property=\"og:locale\" content=\"nl_NL\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Concurrency in Java Part 1 - Introduction\" \/>\n<meta property=\"og:description\" content=\"Read the first part of our blog series devoted to concurrency in Java.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/thecodest.co\/nl\/blog\/gelijktijdigheid-in-java-deel-1-inleiding\/\" \/>\n<meta property=\"og:site_name\" content=\"The Codest\" \/>\n<meta property=\"article:published_time\" content=\"2022-06-15T05:27:58+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-03-11T05:59:41+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/concurrency_in_java_part_1_-_introduction.png\" \/>\n\t<meta property=\"og:image:width\" content=\"960\" \/>\n\t<meta property=\"og:image:height\" content=\"540\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"thecodest\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"thecodest\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/\"},\"author\":{\"name\":\"thecodest\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\"},\"headline\":\"Concurrency in Java Part 1 &#8211; Introduction\",\"datePublished\":\"2022-06-15T05:27:58+00:00\",\"dateModified\":\"2026-03-11T05:59:41+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/\"},\"wordCount\":1295,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/concurrency_in_java_part_1_-_introduction.png\",\"articleSection\":[\"Software Development\"],\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/\",\"name\":\"Concurrency in Java Part 1 - Introduction - The Codest\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/concurrency_in_java_part_1_-_introduction.png\",\"datePublished\":\"2022-06-15T05:27:58+00:00\",\"dateModified\":\"2026-03-11T05:59:41+00:00\",\"description\":\"Read the first part of our blog series devoted to concurrency in Java.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/#breadcrumb\"},\"inLanguage\":\"nl-NL\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/#primaryimage\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/concurrency_in_java_part_1_-_introduction.png\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/05\\\/concurrency_in_java_part_1_-_introduction.png\",\"width\":960,\"height\":540},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/thecodest.co\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Concurrency in Java Part 1 &#8211; Introduction\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#website\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"name\":\"The Codest\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/thecodest.co\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"nl-NL\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"contentUrl\":\"https:\\\/\\\/thecodest.co\\\/app\\\/uploads\\\/2024\\\/03\\\/thecodest-logo.svg\",\"width\":144,\"height\":36,\"caption\":\"The Codest\"},\"image\":{\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/pl.linkedin.com\\\/company\\\/codest\",\"https:\\\/\\\/clutch.co\\\/profile\\\/codest\"]},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#\\\/schema\\\/person\\\/7e3fe41dfa4f4e41a7baad4c6e0d4f76\",\"name\":\"thecodest\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"nl-NL\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g\",\"caption\":\"thecodest\"},\"url\":\"https:\\\/\\\/thecodest.co\\\/nl\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Concurrency in Java Deel 1 - Inleiding - The Codest","description":"Lees het eerste deel van onze blogserie over concurrency in Java.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/thecodest.co\/nl\/blog\/gelijktijdigheid-in-java-deel-1-inleiding\/","og_locale":"nl_NL","og_type":"article","og_title":"Concurrency in Java Part 1 - Introduction","og_description":"Read the first part of our blog series devoted to concurrency in Java.","og_url":"https:\/\/thecodest.co\/nl\/blog\/gelijktijdigheid-in-java-deel-1-inleiding\/","og_site_name":"The Codest","article_published_time":"2022-06-15T05:27:58+00:00","article_modified_time":"2026-03-11T05:59:41+00:00","og_image":[{"width":960,"height":540,"url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/concurrency_in_java_part_1_-_introduction.png","type":"image\/png"}],"author":"thecodest","twitter_card":"summary_large_image","twitter_misc":{"Written by":"thecodest","Est. reading time":"6 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/#article","isPartOf":{"@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/"},"author":{"name":"thecodest","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76"},"headline":"Concurrency in Java Part 1 &#8211; Introduction","datePublished":"2022-06-15T05:27:58+00:00","dateModified":"2026-03-11T05:59:41+00:00","mainEntityOfPage":{"@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/"},"wordCount":1295,"commentCount":0,"publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"image":{"@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/concurrency_in_java_part_1_-_introduction.png","articleSection":["Software Development"],"inLanguage":"nl-NL","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/","url":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/","name":"Concurrency in Java Deel 1 - Inleiding - The Codest","isPartOf":{"@id":"https:\/\/thecodest.co\/#website"},"primaryImageOfPage":{"@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/#primaryimage"},"image":{"@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/#primaryimage"},"thumbnailUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/concurrency_in_java_part_1_-_introduction.png","datePublished":"2022-06-15T05:27:58+00:00","dateModified":"2026-03-11T05:59:41+00:00","description":"Lees het eerste deel van onze blogserie over concurrency in Java.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/#breadcrumb"},"inLanguage":"nl-NL","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/"]}]},{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/#primaryimage","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/concurrency_in_java_part_1_-_introduction.png","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/05\/concurrency_in_java_part_1_-_introduction.png","width":960,"height":540},{"@type":"BreadcrumbList","@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/thecodest.co\/"},{"@type":"ListItem","position":2,"name":"Concurrency in Java Part 1 &#8211; Introduction"}]},{"@type":"WebSite","@id":"https:\/\/thecodest.co\/#website","url":"https:\/\/thecodest.co\/","name":"The Codest","description":"","publisher":{"@id":"https:\/\/thecodest.co\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/thecodest.co\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"nl-NL"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/","url":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","contentUrl":"https:\/\/thecodest.co\/app\/uploads\/2024\/03\/thecodest-logo.svg","width":144,"height":36,"caption":"The Codest"},"image":{"@id":"https:\/\/thecodest.co\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/pl.linkedin.com\/company\/codest","https:\/\/clutch.co\/profile\/codest"]},{"@type":"Person","@id":"https:\/\/thecodest.co\/#\/schema\/person\/7e3fe41dfa4f4e41a7baad4c6e0d4f76","name":"thecodest","image":{"@type":"ImageObject","inLanguage":"nl-NL","@id":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/5dbfe6a1e8c86e432e8812759e34e6fe82ebac75119ae3237a6c1311fa19caf4?s=96&d=mm&r=g","caption":"thecodest"},"url":"https:\/\/thecodest.co\/nl\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/posts\/3138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/comments?post=3138"}],"version-history":[{"count":8,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/posts\/3138\/revisions"}],"predecessor-version":[{"id":8551,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/posts\/3138\/revisions\/8551"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/media\/3139"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/media?parent=3138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/categories?post=3138"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/nl\/wp-json\/wp\/v2\/tags?post=3138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}