{"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":"paralleelsus-java-osa-1-sissejuhatus","status":"publish","type":"post","link":"https:\/\/thecodest.co\/et\/blog\/concurrency-in-java-part-1-introduction\/","title":{"rendered":"Samaaegsus Java's 1. osa - Sissejuhatus"},"content":{"rendered":"<p>\u00dcldiselt on tavap\u00e4rane programmeerimismeetod j\u00e4rjestikune. K\u00f5ik programmis toimub \u00fcks samm korraga.<br>Kuid tegelikult on paralleel see, kuidas kogu maailm t\u00f6\u00f6tab - see on v\u00f5ime t\u00e4ita rohkem kui \u00fchte \u00fclesannet samaaegselt.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Niit vs. protsess<\/h2>\n\n\n\n<p>Arutleda selliste edasij\u00f5udnud teemade \u00fcle nagu <strong>paralleelsus <a href=\"https:\/\/thecodest.co\/et\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> v\u00f5i multithreading, peame leppima kokku m\u00f5nes \u00fchises definitsioonis, et olla kindel, et oleme \u00fchel ja samal lehek\u00fcljel.<\/p>\n\n\n\n<p>Alustame p\u00f5hit\u00f5dedest. Mittesekventsionaalses maailmas on meil kahte liiki samaaegsuse esindajad: protsessid ja<br>niidid. Protsess on k\u00e4imasoleva programmi instants. Tavaliselt on see teistest protsessidest isoleeritud.<br>Operatsioonis\u00fcsteem vastutab igale protsessile ressursside m\u00e4\u00e4ramise eest. Lisaks sellele toimib see dirigendina, mis<br>ajakava ja kontrollib neid.<\/p>\n\n\n\n<p>Niit on omamoodi protsess, kuid madalamal tasemel, seet\u00f5ttu nimetatakse seda ka kergeks niidiks. Mitu niiti v\u00f5ib t\u00f6\u00f6tada \u00fches<br>protsess. Siinkohal tegutseb programm niitide ajaplaneerijana ja kontrollerina. Sel viisil n\u00e4ivad \u00fcksikud programmid teha<br>mitu \u00fclesannet korraga.<\/p>\n\n\n\n<p>P\u00f5hiline erinevus niitide ja protsesside vahel on isolatsioonitase. Protsessil on oma komplekt<br>ressursse, samas kui niit jagab <a href=\"https:\/\/thecodest.co\/et\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">andmed<\/a> teiste teemadega. See v\u00f5ib tunduda vigade tekkimise ohtlik l\u00e4henemine ja seda see ka on. Sest<br>n\u00fc\u00fcd ei keskendu me sellele, sest see ei kuulu k\u00e4esoleva artikli reguleerimisalasse.<\/p>\n\n\n\n<p>Protsessid, niidid - ok... Aga mis t\u00e4pselt on samaaegsus? Samaaegsus t\u00e4hendab, et saab t\u00e4ita mitu \u00fclesannet korraga.<br>aeg. See ei t\u00e4henda, et need \u00fclesanded peavad toimuma samaaegselt - see ongi paralleelsus. <strong>Concurrenc in Javay<\/strong> samuti ei ole<br>n\u00f5uavad, et teil oleks mitu protsessorit v\u00f5i isegi mitu s\u00fcdamikku. Seda on v\u00f5imalik saavutada \u00fche tuumaga keskkonnas, kasutades \u00e4ra<br>konteksti vahetamine.<\/p>\n\n\n\n<p>Samaaegsusega seotud termin on mitmelaiendamine. See on programmide omadus, mis v\u00f5imaldab neil t\u00e4ita korraga mitut \u00fclesannet. Mitte iga programm ei kasuta seda l\u00e4henemist, kuid neid, mis seda teevad, v\u00f5ib nimetada multithreaded'iks.<\/p>\n\n\n\n<p>Me oleme peaaegu valmis, vaid veel \u00fcks m\u00e4\u00e4ratlus. As\u00fcnkroonsus t\u00e4hendab, et programm sooritab mitteblokeerivaid operatsioone.<br>See algatab \u00fclesande ja j\u00e4tkab seej\u00e4rel vastuse ootamise ajal muude asjadega. Kui ta saab vastuse, v\u00f5ib ta <a href=\"https:\/\/thecodest.co\/et\/blog\/react-development-all-you-have-to-know\/\">reageeri<\/a> sellele.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">K\u00f5ik see jazz<\/h2>\n\n\n\n<p>Vaikimisi on iga <strong>Java rakendus<\/strong> t\u00f6\u00f6tab \u00fches protsessis. Selles protsessis on \u00fcks niit, mis on seotud <code>main()<\/code> meetod<br>taotlus. Kuid, nagu mainitud, on v\u00f5imalik kasutada mitme niidi mehhanisme \u00fches<br>programm.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">K\u00e4ivitatav<\/h3>\n\n\n\n<p><code>Teema<\/code> on <strong>Java<\/strong> klass, kus toimub maagia. See on eelpool mainitud niidi objekti representatsioon. Et<br>luua oma l\u00f5im, saate laiendada <code>Teema<\/code> klass. See ei ole siiski soovitatav l\u00e4henemisviis. <code>Niidid<\/code> tuleks kasutada mehhanismi, mis t\u00e4idab \u00fclesannet. \u00dclesanded on t\u00fckid <a href=\"https:\/\/thecodest.co\/et\/dictionary\/what-is-code-refactoring\/\">kood<\/a> mida me tahame k\u00e4ivitada samaaegses re\u017eiimis. Me v\u00f5ime neid defineerida, kasutades <code>K\u00e4ivitatav<\/code> liides.<\/p>\n\n\n\n<p>Kuid teooriast piisab, paneme oma koodi sinna, kus meie suu on.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Probleem<\/h3>\n\n\n\n<p>Oletame, et meil on paar numbrite massiivi. Iga massiivi puhul tahame teada massiivi numbrite summat. Olgu<br>teeselda, et selliseid massiive on palju ja iga\u00fcks neist on suhteliselt suur. Sellistes tingimustes tahame kasutada samaaegsust ja summeerida iga massiivi eraldi \u00fclesandena.<\/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, 10, 10};\nint[] a3 = {3, 4, 3, 3, 4, 3, 4, 2, 1, 3, 7};\n\nRunnable task1 = () -&gt; { {\n    int sum = Arrays.stream(a1).sum();\n    System.out.println(\"1. Summa on: \" + sum);\n};\n\nRunnable task2 = () -&gt; { {\n    int sum = Arrays.stream(a2).sum();\n    System.out.println(\"2. Summa on: \" + sum);\n};\n\nRunnable task3 = () -&gt; { {\n    int sum = Arrays.stream(a3).sum();\n    System.out.println(\"3. Summa on: \" + sum);\n};\n\nnew Thread(task1).start();\nnew Thread(task2).start();\nnew Thread(task3).start();<\/code><\/pre>\n\n\n\n<p>Nagu \u00fclaltoodud koodist n\u00e4ha <code>K\u00e4ivitatav<\/code> on funktsionaalne liides. See sisaldab \u00fchte abstraktset meetodit <code>run()<\/code><br>ilma argumentideta. Veebileht <code>K\u00e4ivitatav<\/code> liidest peaks rakendama iga klass, mille instantsid on m\u00f5eldud kasutamiseks<br>mida teostab niit.<\/p>\n\n\n\n<p>Kui olete m\u00e4\u00e4ratlenud \u00fclesande, saate selle k\u00e4ivitamiseks luua l\u00f5ime. Seda saab teha j\u00e4rgmiselt <code>new Thread()<\/code> konstruktor, mis<br>v\u00f5tab <code>K\u00e4ivitatav<\/code> selle argumendiks.<\/p>\n\n\n\n<p>Viimane samm on <code>start()<\/code> \u00e4sja loodud teema. In the <a href=\"https:\/\/thecodest.co\/et\/blog\/compare-staff-augmentation-firms-that-excel-in-api-team-staffing-for-financial-technology-projects\/\">API<\/a> on ka <code>run()<\/code> meetodid <code>K\u00e4ivitatav<\/code> ja aastal<br><code>Teema<\/code>. See ei ole aga viis, kuidas kasutada Java's samaaegsust. Otsek\u00f5ne igale neist meetoditest annab tulemuseks<br>\u00fclesande t\u00e4itmine samas niidis, mis <code>main()<\/code> meetod t\u00f6\u00f6tab.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Niidipargid ja t\u00e4itjad<\/h3>\n\n\n\n<p>Kui \u00fclesandeid on palju, ei ole iga \u00fclesande jaoks eraldi niidi loomine hea m\u00f5te. Luua <code>Teema<\/code> on<br>raske operatsioon ja palju parem on olemasolevaid niite taaskasutada kui uusi luua.<\/p>\n\n\n\n<p>Kui programm loob palju l\u00fchiajalisi niite, on parem kasutada niidipooli. Niidipool sisaldab mitmeid<br>k\u00e4ivitamisvalmis, kuid hetkel mitteaktiivsed niidid. Andmine <code>K\u00e4ivitatav<\/code> basseini p\u00f5hjustab \u00fche niidi \u00fcleskutse<br><code>run()<\/code> meetod antud <code>K\u00e4ivitatav<\/code>. P\u00e4rast \u00fclesande t\u00e4itmist on niit endiselt olemas ja on t\u00fchik\u00e4igul.<\/p>\n\n\n\n<p>Okei, sa saad aru - eelista niidipooli k\u00e4sitsi loomise asemel. Aga kuidas saab kasutada niidipooli? Veebileht <code>T\u00e4itjad<\/code><br>klassil on mitmeid staatilisi tehasesiseseid meetodeid niidipoolide konstrueerimiseks. N\u00e4iteks <code>newCachedThredPool()<\/code> loob<br>bassein, kuhu luuakse vajaduse korral uusi niite ja t\u00fchjaksj\u00e4\u00e4nud niite hoitakse 60 sekundit. Seevastu,<br><code>newFixedThreadPool()<\/code> sisaldab fikseeritud niitide kogumit, kus t\u00fchjad niidid hoitakse l\u00f5putult.<\/p>\n\n\n\n<p>Vaatame, kuidas see meie n\u00e4ites toimida v\u00f5iks. N\u00fc\u00fcd ei pea me niite k\u00e4sitsi looma. Selle asemel peame looma<br><code>ExecutorService<\/code> mis pakub niitide kogumit. Seej\u00e4rel saame sellele \u00fclesandeid m\u00e4\u00e4rata. Viimane samm on niidi sulgemine<br>basseini, et v\u00e4ltida m\u00e4lulekkeid. \u00dclej\u00e4\u00e4nud eelmine kood j\u00e4\u00e4b samaks.<\/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\">V\u00e4ljakutsetav<\/h3>\n\n\n\n<p><code>K\u00e4ivitatav<\/code> n\u00e4ib olevat nutikas viis samaaegsete \u00fclesannete loomiseks, kuid sellel on \u00fcks suur puudus. See ei saa tagastada \u00fchtegi<br>v\u00e4\u00e4rtus. Veelgi enam, me ei saa kindlaks teha, kas \u00fclesanne on l\u00f5petatud v\u00f5i mitte. Samuti ei tea me, kas see on l\u00f5petatud.<br>tavaliselt v\u00f5i erandkorras. Nende h\u00e4dade lahendus on <code>V\u00e4ljakutsetav<\/code>.<\/p>\n\n\n\n<p><code>V\u00e4ljakutsetav<\/code> on sarnane <code>K\u00e4ivitatav<\/code> viisil ka as\u00fcnkroonseid \u00fclesandeid. Peamine erinevus seisneb selles, et see suudab<br>tagastada v\u00e4\u00e4rtus. Tagastusv\u00e4\u00e4rtus v\u00f5ib olla mis tahes (mitte-primitiivse) t\u00fc\u00fcbiga, sest <code>V\u00e4ljakutsetav<\/code> liides on parameetriga t\u00fc\u00fcp.<br><code>V\u00e4ljakutsetav<\/code> on funktsionaalne liides, millel on <code>call()<\/code> meetod, mis v\u00f5ib visata <code>Erand<\/code>.<\/p>\n\n\n\n<p>N\u00fc\u00fcd vaatame, kuidas me saame v\u00f5imendada <code>V\u00e4ljakutsetav<\/code> meie massiivi 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, 10, 10, 10};\nint[] a3 = {3, 4, 3, 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. Summa on: \" + future1.get());\nSystem.out.println(\"2. Summa on: \" + future2.get());\nSystem.out.println(\"3. Summa on: \" + future3.get());\n\nexecutor.shutdown();<\/code><\/pre>\n\n\n\n<p>Okei, me n\u00e4eme, kuidas <code>V\u00e4ljakutsetav<\/code> luuakse ja seej\u00e4rel esitatakse <code>ExecutorService<\/code>. Aga mis kurat on <code>Tulevik<\/code>?<br><code>Tulevik<\/code> toimib sildana l\u00f5imede vahel. Iga massiivi summa toodetakse eraldi niidiga ja meil on vaja viisi, kuidas teha<br>saada need tulemused tagasi <code>main()<\/code>.<\/p>\n\n\n\n<p>Tulemuse k\u00e4ttesaamiseks aadressilt <code>Tulevik<\/code> me peame helistama <code>get()<\/code> meetod. Siin v\u00f5ib juhtuda \u00fcks kahest asjast. Esiteks v\u00f5ib<br>arvutuste tulemus, mille on teinud <code>V\u00e4ljakutsetav<\/code> on saadaval. Siis me saame selle kohe. Teiseks, tulemus ei ole<br>veel valmis. Sel juhul <code>get()<\/code> meetod blokeerib, kuni tulemus on saadaval.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">ComputableFuture<\/h3>\n\n\n\n<p>K\u00fcsimus seoses <code>Tulevik<\/code> on see, et see t\u00f6\u00f6tab \"push-paradigmas\". Kasutades <code>Tulevik<\/code> sa pead olema nagu \u00fclemus, kes<br>k\u00fcsib pidevalt: \"Kas teie \u00fclesanne on t\u00e4idetud? Kas see on valmis?\", kuni see annab tulemuse. Pideva surve all tegutsemine on<br>kallis. Palju parem oleks tellida <code>Tulevik<\/code> mida teha, kui ta on oma \u00fclesandega valmis. Kahjuks,<br><code>Tulevik<\/code> ei saa seda teha, kuid <code>ComputableFuture<\/code> saab.<\/p>\n\n\n\n<p><code>ComputableFuture<\/code> t\u00f6\u00f6tab \"t\u00f5mbeparadigmas\". Me saame \u00f6elda, mida teha tulemusega, kui see on oma \u00fclesanded t\u00e4itnud. See<br>on n\u00e4ide as\u00fcnkroonsest l\u00e4henemisviisist.<\/p>\n\n\n\n<p><code>ComputableFuture<\/code> t\u00f6\u00f6tab suurep\u00e4raselt koos <code>K\u00e4ivitatav<\/code> kuid mitte <code>V\u00e4ljakutsetav<\/code>. Selle asemel on v\u00f5imalik anda \u00fclesanne, et<br><code>ComputableFuture<\/code> kujul <code>Tarnija<\/code>.<\/p>\n\n\n\n<p>Vaatame, kuidas \u00fclaltoodu on seotud meie probleemiga.<\/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, 10, 10};\nint[] a3 = {3, 4, 3, 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>Esimene asi, mis silma torkab, on see, kui palju l\u00fchem on see lahendus. Peale selle n\u00e4eb see ka puhas ja korralik v\u00e4lja.<\/p>\n\n\n\n<p>\u00dclesanne <code>ValmisTulevik<\/code> v\u00f5ib anda <code>supplyAsync()<\/code> meetod, mis v\u00f5tab <code>Tarnija<\/code> v\u00f5i <code>runAsync()<\/code> et<br>v\u00f5tab <code>K\u00e4ivitatav<\/code>. Tagasikutsumine - kood, mis tuleb k\u00e4ivitada \u00fclesande l\u00f5petamisel - on defineeritud j\u00e4rgmiselt. <code>thenAccept()<\/code><br>meetod.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">J\u00e4reldused<\/h2>\n\n\n\n<p><strong>Java<\/strong> pakub palju erinevaid l\u00e4henemisviise samaaegsusele. Selles artiklis me vaevu puudutasime seda teemat.<\/p>\n\n\n\n<p>Sellegipoolest k\u00e4sitlesime p\u00f5hit\u00f5desid <code>Teema<\/code>, <code>K\u00e4ivitatav<\/code>, <code>V\u00e4ljakutsetav<\/code>ja <code>CallableFuture<\/code> mis on hea m\u00f5te<br>teema edasiseks uurimiseks.<\/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>Loe meie blogisarja esimest osa, mis on p\u00fchendatud Java paralleelsusele. J\u00e4rgnevas artiklis vaatleme l\u00e4hemalt niidi ja protsessi erinevusi, niidipooli, t\u00e4itjaid ja palju muud!<\/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\/et\/blogi\/paralleelsus-java-osa-1-sissejuhatus\/\" \/>\n<meta property=\"og:locale\" content=\"et_EE\" \/>\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\/et\/blogi\/paralleelsus-java-osa-1-sissejuhatus\/\" \/>\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\":\"et\",\"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\":\"et\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"et\",\"@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\":\"et\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"et\",\"@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\":\"et\",\"@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\\\/et\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Samaaegsus Java's 1. osa - Sissejuhatus - The Codest","description":"Loe meie blogisarja esimest osa, mis on p\u00fchendatud Java paralleelsusele.","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\/et\/blogi\/paralleelsus-java-osa-1-sissejuhatus\/","og_locale":"et_EE","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\/et\/blogi\/paralleelsus-java-osa-1-sissejuhatus\/","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":"et","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":"Samaaegsus Java's 1. osa - Sissejuhatus - 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":"Loe meie blogisarja esimest osa, mis on p\u00fchendatud Java paralleelsusele.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/#breadcrumb"},"inLanguage":"et","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/"]}]},{"@type":"ImageObject","inLanguage":"et","@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":"et"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"et","@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":"et","@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\/et\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/posts\/3138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/comments?post=3138"}],"version-history":[{"count":8,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/posts\/3138\/revisions"}],"predecessor-version":[{"id":8551,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/posts\/3138\/revisions\/8551"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/media\/3139"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/media?parent=3138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/categories?post=3138"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/et\/wp-json\/wp\/v2\/tags?post=3138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}