{"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":"samtidighed-i-java-del-1-introduktion","status":"publish","type":"post","link":"https:\/\/thecodest.co\/da\/blog\/concurrency-in-java-part-1-introduction\/","title":{"rendered":"Samtidighed i Java del 1 - Introduktion"},"content":{"rendered":"<p>Generelt er den konventionelle programmeringstilgang sekventiel. Alt i et program sker et trin ad gangen.<br>Men faktisk er det parallelle den m\u00e5de, hele verden k\u00f8rer p\u00e5 - det er evnen til at udf\u00f8re mere end \u00e9n opgave samtidig.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Tr\u00e5d vs. proces<\/h2>\n\n\n\n<p>At diskutere avancerede emner som <strong>samtidighed i <a href=\"https:\/\/thecodest.co\/da\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> eller multithreading, er vi n\u00f8dt til at aftale nogle f\u00e6lles definitioner for at v\u00e6re sikre p\u00e5, at vi er p\u00e5 samme side.<\/p>\n\n\n\n<p>Lad os starte med det grundl\u00e6ggende. I den ikke-sekventielle verden har vi to slags samtidighedsrepr\u00e6sentanter: processer og<br>tr\u00e5de. En proces er en instans af det program, der k\u00f8rer. Normalt er den isoleret fra andre processer.<br>Operativsystemet er ansvarligt for at tildele ressourcer til hver proces. Desuden fungerer det som en leder, der<br>planl\u00e6gger og kontrollerer dem.<\/p>\n\n\n\n<p>En tr\u00e5d er en slags proces, men p\u00e5 et lavere niveau, og derfor kaldes den ogs\u00e5 en let tr\u00e5d. Flere tr\u00e5de kan k\u00f8re i en<br>proces. Her fungerer programmet som en scheduler og en controller for tr\u00e5de. P\u00e5 denne m\u00e5de ser de enkelte programmer ud til at g\u00f8re<br>flere opgaver p\u00e5 samme tid.<\/p>\n\n\n\n<p>Den grundl\u00e6ggende forskel mellem tr\u00e5de og processer er isolationsniveauet. Processen har sit eget s\u00e6t af<br>ressourcer, mens tr\u00e5den deler <a href=\"https:\/\/thecodest.co\/da\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">data<\/a> med andre tr\u00e5de. Det kan virke som en fejlbeh\u00e6ftet tilgang, og det er det ogs\u00e5. For<br>Lad os nu ikke fokusere p\u00e5 det, da det ligger uden for rammerne af denne artikel.<\/p>\n\n\n\n<p>Processer, tr\u00e5de - ok ... Men hvad er egentlig samtidighed? Samtidighed betyder, at du kan udf\u00f8re flere opgaver p\u00e5 samme tid.<br>tid. Det betyder ikke, at de opgaver skal k\u00f8re samtidig - det er det, der er parallelisme. <strong>Concurrenc i Javay<\/strong> g\u00f8r det heller ikke<br>kr\u00e6ver, at du har flere CPU'er eller endda flere kerner. Det kan opn\u00e5s i et milj\u00f8 med \u00e9n kerne ved at udnytte<br>skift af kontekst.<\/p>\n\n\n\n<p>Et begreb, der er relateret til samtidighed, er multithreading. Det er en funktion i programmer, der g\u00f8r det muligt for dem at udf\u00f8re flere opgaver p\u00e5 \u00e9n gang. Ikke alle programmer bruger denne tilgang, men dem, der g\u00f8r, kan kaldes flertr\u00e5dede.<\/p>\n\n\n\n<p>Vi er n\u00e6sten klar til at g\u00e5 i gang, bare en definition mere. Asynkroni betyder, at et program udf\u00f8rer ikke-blokerende operationer.<br>Den p\u00e5begynder en opgave og forts\u00e6tter derefter med andre ting, mens den venter p\u00e5 svaret. N\u00e5r den f\u00e5r svaret, kan den <a href=\"https:\/\/thecodest.co\/da\/blog\/react-development-all-you-have-to-know\/\">reagere<\/a> til det.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Alt det der jazz<\/h2>\n\n\n\n<p>Som standard vil hver <strong>Java-applikation<\/strong> k\u00f8rer i \u00e9n proces. I den proces er der en tr\u00e5d, der er relateret til <code>main()<\/code> metode til<br>en applikation. Men som n\u00e6vnt er det muligt at udnytte mekanismerne i flere tr\u00e5de inden for en<br>program.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Kan k\u00f8res<\/h3>\n\n\n\n<p><code>Tr\u00e5d<\/code> er en <strong>Java<\/strong> klasse, hvor magien sker. Dette er objektrepr\u00e6sentationen af den f\u00f8rn\u00e6vnte tr\u00e5d. Til<br>oprette din egen tr\u00e5d, kan du udvide <code>Tr\u00e5d<\/code> klasse. Det er dog ikke en anbefalet tilgang. <code>Tr\u00e5de<\/code> skal bruges som en mekanisme, der k\u00f8rer opgaven. Opgaver er dele af <a href=\"https:\/\/thecodest.co\/da\/dictionary\/what-is-code-refactoring\/\">Kode<\/a> som vi \u00f8nsker at k\u00f8re i en samtidig tilstand. Vi kan definere dem ved hj\u00e6lp af <code>Kan k\u00f8res<\/code> interface.<\/p>\n\n\n\n<p>Men nok teori, lad os bruge vores kode, hvor vores mund er.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Problem<\/h3>\n\n\n\n<p>Lad os antage, at vi har et par arrays af tal. For hver matrix vil vi gerne vide, hvad summen af tallene i en matrix er. Lad os<br>Lad som om der er mange af den slags arrays, og hver af dem er relativt store. Under s\u00e5danne forhold vil vi g\u00f8re brug af samtidighed og summere hvert array som en separat opgave.<\/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, 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. Summen er: \" + sum);\n};\n\nRunnable task2 = () -&gt; {\n    int sum = Arrays.stream(a2).sum();\n    System.out.println(\"2. Summen er: \" + sum);\n};\n\nRunnable task3 = () -&gt; {\n    int sum = Arrays.stream(a3).sum();\n    System.out.println(\"3. Summen er: \" + sum);\n};\n\nnew Thread(task1).start();\nnew Thread(task2).start();\nnew Thread(task3).start();<\/code><\/pre>\n\n\n\n<p>Som du kan se i koden ovenfor <code>Kan k\u00f8res<\/code> er en funktionel gr\u00e6nseflade. Den indeholder en enkelt abstrakt metode <code>k\u00f8r()<\/code><br>uden argumenter. Den <code>Kan k\u00f8res<\/code> interface b\u00f8r implementeres af enhver klasse, hvis instanser er beregnet til at v\u00e6re<br>udf\u00f8rt af en tr\u00e5d.<\/p>\n\n\n\n<p>N\u00e5r du har defineret en opgave, kan du oprette en tr\u00e5d til at k\u00f8re den. Dette kan g\u00f8res via <code>ny tr\u00e5d()<\/code> konstrukt\u00f8r, der<br>tager <code>Kan k\u00f8res<\/code> som sit argument.<\/p>\n\n\n\n<p>Det sidste skridt er at <code>start()<\/code> en nyoprettet tr\u00e5d. I den <a href=\"https:\/\/thecodest.co\/da\/blog\/compare-staff-augmentation-firms-that-excel-in-api-team-staffing-for-financial-technology-projects\/\">API<\/a> Der er ogs\u00e5 <code>k\u00f8r()<\/code> metoder i <code>Kan k\u00f8res<\/code> og i<br><code>Tr\u00e5d<\/code>. Men det er ikke en m\u00e5de at udnytte samtidighed p\u00e5 i Java. Et direkte kald til hver af disse metoder resulterer i<br>udf\u00f8re opgaven i den samme tr\u00e5d som <code>main()<\/code> metoden k\u00f8rer.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Tr\u00e5dpuljer og eksekutorer<\/h3>\n\n\n\n<p>N\u00e5r der er mange opgaver, er det ikke en god id\u00e9 at oprette en separat tr\u00e5d for hver enkelt. Oprettelse af en <code>Tr\u00e5d<\/code> er en<br>tung operation, og det er langt bedre at genbruge eksisterende tr\u00e5de end at oprette nye.<\/p>\n\n\n\n<p>N\u00e5r et program opretter mange kortvarige tr\u00e5de, er det bedre at bruge en tr\u00e5dpulje. Tr\u00e5dpuljen indeholder et antal<br>klar til at k\u00f8re, men i \u00f8jeblikket ikke aktive tr\u00e5de. At give en <code>Kan k\u00f8res<\/code> til puljen f\u00e5r en af tr\u00e5dene til at kalde<br><code>k\u00f8r()<\/code> metode af givet <code>Kan k\u00f8res<\/code>. N\u00e5r en opgave er afsluttet, eksisterer tr\u00e5den stadig og er i en inaktiv tilstand.<\/p>\n\n\n\n<p>Okay, du har forst\u00e5et det - du foretr\u00e6kker tr\u00e5dpuljer i stedet for manuel oprettelse. Men hvordan kan du g\u00f8re brug af tr\u00e5dpuljer? Den <code>Eksekutorer<\/code><br>Klassen har en r\u00e6kke statiske fabriksmetoder til konstruktion af tr\u00e5dpuljer. For eksempel <code>newCachedThredPool()<\/code> skaber<br>en pulje, hvor nye tr\u00e5de oprettes efter behov, og inaktive tr\u00e5de opbevares i 60 sekunder. I mods\u00e6tning hertil,<br><code>newFixedThreadPool()<\/code> indeholder et fast s\u00e6t af tr\u00e5de, hvor inaktive tr\u00e5de opbevares p\u00e5 ubestemt tid.<\/p>\n\n\n\n<p>Lad os se, hvordan det kan fungere i vores eksempel. Nu beh\u00f8ver vi ikke at oprette tr\u00e5de manuelt. I stedet skal vi oprette<br><code>Udf\u00f8rerService<\/code> som giver en pulje af tr\u00e5de. Derefter kan vi tildele opgaver til den. Det sidste trin er at lukke tr\u00e5den<br>pool for at undg\u00e5 hukommelsesl\u00e6kager. Resten af den tidligere kode forbliver den samme.<\/p>\n\n\n\n<pre class=\"wp-block-code\"><code lang=\"java\" class=\"language-java\">ExecutorService executor = Executors.newCachedThreadPool();\n\nexecutor.submit(opgave1);\nexecutor.submit(opgave2);\nexecutor.submit(opgave3);\n\nexecutor.shutdown();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Kan kaldes<\/h3>\n\n\n\n<p><code>Kan k\u00f8res<\/code> virker som en smart m\u00e5de at skabe samtidige opgaver p\u00e5, men den har en stor mangel. Den kan ikke returnere nogen<br>v\u00e6rdi. Desuden kan vi ikke afg\u00f8re, om en opgave er f\u00e6rdig eller ej. Vi ved heller ikke, om den er afsluttet.<br>normalt eller us\u00e6dvanligt. L\u00f8sningen p\u00e5 disse problemer er <code>Kan kaldes<\/code>.<\/p>\n\n\n\n<p><code>Kan kaldes<\/code> svarer til <code>Kan k\u00f8res<\/code> P\u00e5 en m\u00e5de omslutter den ogs\u00e5 asynkrone opgaver. Den st\u00f8rste forskel er, at den er i stand til at<br>returnere en v\u00e6rdi. Returv\u00e6rdien kan v\u00e6re af en hvilken som helst (ikke-primitiv) type, da <code>Kan kaldes<\/code> interface er en parameteriseret type.<br><code>Kan kaldes<\/code> er en funktionel gr\u00e6nseflade, der har <code>opkald()<\/code> metode, som kan kaste en <code>Undtagelse<\/code>.<\/p>\n\n\n\n<p>Lad os nu se, hvordan vi kan udnytte <code>Kan kaldes<\/code> i vores array-problem.<\/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, 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).sum();\nCallable task3 = () -&gt; Arrays.stream(a3).sum();\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. Summen er: \" + future1.get());\nSystem.out.println(\"2. Summen er: \" + future2.get());\nSystem.out.println(\"3. Summen er: \" + future3.get());\n\nexecutor.shutdown();<\/code><\/pre>\n\n\n\n<p>Okay, vi kan se, hvordan <code>Kan kaldes<\/code> oprettes og sendes derefter til <code>Udf\u00f8rerService<\/code>. Men hvad pokker er <code>Fremtiden<\/code>?<br><code>Fremtiden<\/code> fungerer som en bro mellem tr\u00e5dene. Summen af hvert array produceres i en separat tr\u00e5d, og vi har brug for en m\u00e5de at<br>f\u00e5 disse resultater tilbage til <code>main()<\/code>.<\/p>\n\n\n\n<p>For at hente resultatet fra <code>Fremtiden<\/code> Vi er n\u00f8dt til at ringe <code>get()<\/code> metode. Her kan der ske en af to ting. For det f\u00f8rste kan<br>resultatet af den beregning, der udf\u00f8res af <code>Kan kaldes<\/code> er tilg\u00e6ngelig. S\u00e5 f\u00e5r vi det med det samme. For det andet er resultatet ikke<br>klar endnu. I det tilf\u00e6lde <code>get()<\/code> metoden vil blokere, indtil resultatet er tilg\u00e6ngeligt.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">ComputableFuture<\/h3>\n\n\n\n<p>Problemet med <code>Fremtiden<\/code> er, at det fungerer i 'push-paradigmet'. N\u00e5r man bruger <code>Fremtiden<\/code> Du skal v\u00e6re som en chef, der<br>sp\u00f8rger konstant: \"Er din opgave f\u00e6rdig? Er den klar?\", indtil den giver et resultat. At handle under konstant pres er<br>dyrt. En langt bedre tilgang ville v\u00e6re at bestille <code>Fremtiden<\/code> hvad den skal g\u00f8re, n\u00e5r den er klar med sin opgave. Desv\u00e6rre,<br><code>Fremtiden<\/code> kan ikke g\u00f8re det, men <code>ComputableFuture<\/code> kan.<\/p>\n\n\n\n<p><code>ComputableFuture<\/code> arbejder i 'pull-paradigmet'. Vi kan fort\u00e6lle den, hvad den skal g\u00f8re med resultatet, n\u00e5r den er f\u00e6rdig med sine opgaver. Den<br>er et eksempel p\u00e5 en asynkron tilgang.<\/p>\n\n\n\n<p><code>ComputableFuture<\/code> fungerer perfekt med <code>Kan k\u00f8res<\/code> men ikke med <code>Kan kaldes<\/code>. I stedet er det muligt at levere en opgave til<br><code>ComputableFuture<\/code> i form af <code>Leverand\u00f8r<\/code>.<\/p>\n\n\n\n<p>Lad os se, hvordan ovenst\u00e5ende h\u00e6nger sammen med vores problem.<\/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, 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>Det f\u00f8rste, der sl\u00e5r dig, er, hvor meget kortere denne l\u00f8sning er. Desuden ser det ogs\u00e5 p\u00e6nt og ryddeligt ud.<\/p>\n\n\n\n<p>Opgave til <code>Fuldst\u00e6ndigFremtid<\/code> kan leveres af <code>supplyAsync()<\/code> metode, der tager <code>Leverand\u00f8r<\/code> eller af <code>runAsync()<\/code> at<br>tager <code>Kan k\u00f8res<\/code>. Et tilbagekald - et stykke kode, der skal k\u00f8res, n\u00e5r opgaven er fuldf\u00f8rt - defineres af <code>thenAccept()<\/code><br>metode.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Konklusioner<\/h2>\n\n\n\n<p><strong>Java<\/strong> giver mange forskellige tilgange til samtidighed. I denne artikel har vi kun lige ber\u00f8rt emnet.<\/p>\n\n\n\n<p>Ikke desto mindre d\u00e6kkede vi det grundl\u00e6ggende i <code>Tr\u00e5d<\/code>, <code>Kan k\u00f8res<\/code>, <code>Kan kaldes<\/code>og <code>CallableFuture<\/code> hvilket er en god pointe<br>for yderligere unders\u00f8gelse af emnet.<\/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>L\u00e6s f\u00f8rste del af vores blogserie om samtidighed i Java. I den f\u00f8lgende artikel vil vi se n\u00e6rmere p\u00e5 forskellene mellem tr\u00e5d og proces, tr\u00e5dpuljer, eksekutorer og meget mere!<\/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\/da\/blog\/samtidighed-i-java-del-1-introduktion\/\" \/>\n<meta property=\"og:locale\" content=\"da_DK\" \/>\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\/da\/blog\/samtidighed-i-java-del-1-introduktion\/\" \/>\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 minutter\" \/>\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\":\"da-DK\",\"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\":\"da-DK\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@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\":\"da-DK\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"da-DK\",\"@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\":\"da-DK\",\"@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\\\/da\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Samtidighed i Java del 1 - Introduktion - The Codest","description":"L\u00e6s f\u00f8rste del af vores blogserie om samtidighed i 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\/da\/blog\/samtidighed-i-java-del-1-introduktion\/","og_locale":"da_DK","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\/da\/blog\/samtidighed-i-java-del-1-introduktion\/","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 minutter"},"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":"da-DK","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":"Samtidighed i Java del 1 - Introduktion - 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":"L\u00e6s f\u00f8rste del af vores blogserie om samtidighed i Java.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/#breadcrumb"},"inLanguage":"da-DK","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/"]}]},{"@type":"ImageObject","inLanguage":"da-DK","@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":"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":"da-DK"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"da-DK","@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":"da-DK","@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\/da\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/da\/wp-json\/wp\/v2\/posts\/3138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/da\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/da\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/da\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/da\/wp-json\/wp\/v2\/comments?post=3138"}],"version-history":[{"count":8,"href":"https:\/\/thecodest.co\/da\/wp-json\/wp\/v2\/posts\/3138\/revisions"}],"predecessor-version":[{"id":8551,"href":"https:\/\/thecodest.co\/da\/wp-json\/wp\/v2\/posts\/3138\/revisions\/8551"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/da\/wp-json\/wp\/v2\/media\/3139"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/da\/wp-json\/wp\/v2\/media?parent=3138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/da\/wp-json\/wp\/v2\/categories?post=3138"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/da\/wp-json\/wp\/v2\/tags?post=3138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}