{"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":"vienlaicigums-java-1-dala-ievads","status":"publish","type":"post","link":"https:\/\/thecodest.co\/lv\/blog\/concurrency-in-java-part-1-introduction\/","title":{"rendered":"Vienlaic\u012bgums Java 1. da\u013ca - Ievads"},"content":{"rendered":"<p>Kopum\u0101 tradicion\u0101l\u0101 programm\u0113\u0161anas pieeja ir sec\u012bga. Programm\u0101 viss notiek soli pa solim.<br>Ta\u010du paties\u012bb\u0101 paral\u0113li darbojas visa pasaule - t\u0101 ir sp\u0113ja vienlaic\u012bgi izpild\u012bt vair\u0101k nek\u0101 vienu uzdevumu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">V\u012btne pret procesu<\/h2>\n\n\n\n<p>Apspriest t\u0101das progres\u012bvas t\u0113mas k\u0101. <strong>vienlaic\u012bgums <a href=\"https:\/\/thecodest.co\/lv\/blog\/top-programming-languages-to-build-e-commerce\/\">Java<\/a><\/strong> vai daudzpavedienu re\u017e\u012bm\u0101, mums ir j\u0101vienojas par kop\u012bg\u0101m defin\u012bcij\u0101m, lai p\u0101rliecin\u0101tos, ka esam vienispr\u0101tis.<\/p>\n\n\n\n<p>S\u0101ksim ar pamatiem. Nesekvenci\u0101laj\u0101 pasaul\u0113 mums ir divu veidu vienlaic\u012bbas reprezentanti: procesi un<br>pavedieni. Process ir izpild\u012btas programmas gad\u012bjums. Parasti tas ir izol\u0113ts no citiem procesiem.<br>Oper\u0113t\u0101jsist\u0113ma ir atbild\u012bga par resursu pie\u0161\u0137ir\u0161anu katram procesam. Turkl\u0101t t\u0101 darbojas k\u0101 diri\u0123ents, kas<br>pl\u0101no un kontrol\u0113 to izpildi.<\/p>\n\n\n\n<p>Diegs ir sava veida process, bet zem\u0101k\u0101 l\u012bmen\u012b, t\u0101p\u0113c to sauc ar\u012b par vieglo diegu. Vair\u0101ki pavedieni var darboties vien\u0101<br>process. \u0160aj\u0101 gad\u012bjum\u0101 programma darbojas k\u0101 pl\u0101no\u0161anas programma un pavedienu kontrolieris. \u0160\u0101d\u0101 veid\u0101 atsevi\u0161\u0137as programmas, \u0161\u0137iet, veic<br>vair\u0101kus uzdevumus vienlaic\u012bgi.<\/p>\n\n\n\n<p>Pamatat\u0161\u0137ir\u012bba starp pavedieniem un procesiem ir izol\u0101cijas l\u012bmenis. Procesam ir savs<br>resursus, savuk\u0101rt pavediens koplieto <a href=\"https:\/\/thecodest.co\/lv\/blog\/app-data-collection-security-risks-value-and-types-explored\/\">dati<\/a> ar citiem pavedieniem. T\u0101 var \u0161\u0137ist uz k\u013c\u016bd\u0101m tend\u0113ta pieeja, un t\u0101 patie\u0161\u0101m ir. Attiec\u012bb\u0101 uz<br>tagad neiedzi\u013cin\u0101simies \u0161aj\u0101 jaut\u0101jum\u0101, jo tas ir \u0101rpus \u0161\u012b raksta darb\u012bbas jomas.<\/p>\n\n\n\n<p>Procesi, pavedieni - labi... Bet kas \u012bsti ir vienlaic\u012bgums? Vienlaic\u012bga izpilde noz\u012bm\u0113, ka vienlaic\u012bgi var izpild\u012bt vair\u0101kus uzdevumus.<br>laiks. Tas nenoz\u012bm\u0113, ka \u0161iem uzdevumiem ir j\u0101str\u0101d\u0101 vienlaic\u012bgi - tas ir paral\u0113lisms. <strong>Concurrenc in Javay<\/strong> ar\u012b nav<br>ir nepiecie\u0161ami vair\u0101ki procesori vai pat vair\u0101ki kodoli. To var pan\u0101kt viena kodola vid\u0113, izmantojot<br>konteksta p\u0101rsl\u0113g\u0161ana.<\/p>\n\n\n\n<p>Ar vienlaic\u012bgumu saist\u012bts termins ir daudzpavedienu lietojums. T\u0101 ir programmu iez\u012bme, kas \u013cauj t\u0101m izpild\u012bt vair\u0101kus uzdevumus vienlaic\u012bgi. Ne visas programmas izmanto \u0161o pieeju, bet t\u0101s, kas to dara, var saukt par daudzpavedienu programm\u0101m.<\/p>\n\n\n\n<p>M\u0113s esam gandr\u012bz gatavi doties ce\u013c\u0101, tikai v\u0113l viena defin\u012bcija. Asinhronit\u0101te noz\u012bm\u0113, ka programma veic neblo\u0137\u0113jo\u0161as oper\u0101cijas.<br>T\u0101 uzs\u0101k uzdevumu un p\u0113c tam, gaidot atbildi, turpina veikt citas darb\u012bbas. Kad t\u0101 sa\u0146em atbildi, t\u0101 var <a href=\"https:\/\/thecodest.co\/lv\/blog\/react-development-all-you-have-to-know\/\">rea\u0123\u0113t<\/a> uz to.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Viss \u0161is d\u017eezs<\/h2>\n\n\n\n<p>P\u0113c noklus\u0113juma katrs <strong>Java lietojumprogramma<\/strong> darbojas vien\u0101 proces\u0101. \u0160aj\u0101 proces\u0101 ir viens pavediens, kas saist\u012bts ar <code>galvenais()<\/code> metode<br>pieteikumu. Tom\u0113r, k\u0101 jau min\u0113ts, ir iesp\u0113jams izmantot vair\u0101ku pavedienu meh\u0101nismus vien\u0101 sist\u0113m\u0101.<br>programma.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Runnable<\/h3>\n\n\n\n<p><code>V\u012btne<\/code> ir <strong>Java<\/strong> klase, kur\u0101 notiek burvju darb\u012bba. Tas ir iepriek\u0161 min\u0113t\u0101 pavediena objekta att\u0113lojums. Uz<br>izveidot savu pavedienu, varat papla\u0161in\u0101t <code>V\u012btne<\/code> klase. Tom\u0113r t\u0101 nav ieteicama pieeja. <code>Diegi<\/code> j\u0101izmanto k\u0101 meh\u0101nisms, kas palaist uzdevumu. Uzdevumi ir <a href=\"https:\/\/thecodest.co\/lv\/dictionary\/what-is-code-refactoring\/\">kods<\/a> ko v\u0113lamies palaist vienlaic\u012bg\u0101 re\u017e\u012bm\u0101. Tos varam defin\u0113t, izmantojot <code>Runnable<\/code> saskarne.<\/p>\n\n\n\n<p>Bet pietiek ar teoriju, izmantosim kodu tur, kur ir m\u016bsu mute.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Probl\u0113ma<\/h3>\n\n\n\n<p>Pie\u0146emsim, ka mums ir vair\u0101ki skait\u013cu mas\u012bvi. Katram mas\u012bvam m\u0113s v\u0113lamies uzzin\u0101t mas\u012bv\u0101 eso\u0161o skait\u013cu summu. Pie\u0146emsim<br>izliekas, ka \u0161\u0101du mas\u012bvu ir daudz, un katrs no tiem ir sal\u012bdzino\u0161i liels. \u0160\u0101dos apst\u0101k\u013cos m\u0113s v\u0113lamies izmantot vienlaic\u012bgumu un summ\u0113t katru mas\u012bvu k\u0101 atsevi\u0161\u0137u uzdevumu.<\/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, 10, 10};\nint[] a3 = {3, 4, 3, 4, 4, 3, 4, 2, 1, 3, 7};\n\nRunnable task1 = () -&gt; { {\n    int sum = Arrays.stream(a1).sum();\n    System.out.println(\"1. Summa ir: \" + sum);\n};\n\nRunnable task2 = () -&gt; {\n    int sum = Arrays.stream(a2).sum();\n    System.out.println(\"2. Summa ir: \" + sum);\n};\n\nRunnable uzdevums3 = () -&gt; {\n    int sum = Arrays.stream(a3).sum();\n    System.out.println(\"3. Summa ir: \" + sum);\n};\n\nnew Thread(task1).start();\nnew Thread(task2).start();\nnew Thread(task3).start();<\/code><\/pre>\n\n\n\n<p>K\u0101 redzams iepriek\u0161 pievienotaj\u0101 kod\u0101. <code>Runnable<\/code> ir funkcion\u0101la saskarne. T\u0101 satur vienu abstraktu metodi <code>palaist()<\/code><br>bez argumentiem. Port\u0101ls <code>Runnable<\/code> interfeiss j\u0101implement\u0113 jebkurai klasei, kuras eksempl\u0101ri ir paredz\u0113ti, lai b\u016btu<br>izpilda pavediens.<\/p>\n\n\n\n<p>Kad uzdevums ir defin\u0113ts, varat izveidot pavedienu t\u0101 izpildei. To var izdar\u012bt, izmantojot <code>jauns pavediens()<\/code> konstruktors, kas<br>aiz\u0146em <code>Runnable<\/code> k\u0101 argumentu.<\/p>\n\n\n\n<p>P\u0113d\u0113jais solis ir <code>s\u0101kt()<\/code> jaunizveidots pavediens. In <a href=\"https:\/\/thecodest.co\/lv\/blog\/compare-staff-augmentation-firms-that-excel-in-api-team-staffing-for-financial-technology-projects\/\">API<\/a> ir ar\u012b <code>palaist()<\/code> metodes <code>Runnable<\/code> un<br><code>V\u012btne<\/code>. Tom\u0113r tas nav veids, k\u0101 izmantot vienlaic\u012bgumu Java. Katras no \u0161\u012bm metod\u0113m tie\u0161ais izsaukums rada<br>izpild\u012bt uzdevumu taj\u0101 pa\u0161\u0101 pavedien\u0101, kur\u0101 <code>galvenais()<\/code> metode darbojas.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">V\u012bt\u0146u p\u016bli un izpild\u012bt\u0101ji<\/h3>\n\n\n\n<p>Ja ir daudz uzdevumu, nav laba ideja katram uzdevumam izveidot atsevi\u0161\u0137u pavedienu. Izveidojot <code>V\u012btne<\/code> ir<br>smagsvara oper\u0101cija, un ir daudz lab\u0101k atk\u0101rtoti izmantot eso\u0161os pavedienus, nevis rad\u012bt jaunus.<\/p>\n\n\n\n<p>Ja programma rada daudz \u012bslaic\u012bgu pavedienu, lab\u0101k ir izmantot pavedienu p\u016blu. V\u012bt\u0146u fonds satur vair\u0101kus pavedienus.<br>gatavi darbam, bet pa\u0161laik neakt\u012bvi pavedieni. Sniedzot <code>Runnable<\/code> uz p\u016blu izraisa vienu no pavedieniem, kas izsauc<br><code>palaist()<\/code> dot\u0101 metode <code>Runnable<\/code>. P\u0113c uzdevuma pabeig\u0161anas pavediens joproj\u0101m past\u0101v un atrodas d\u012bkst\u0101ves st\u0101vokl\u012b.<\/p>\n\n\n\n<p>Labi, j\u016bs saprotat - dodiet priek\u0161roku pavedienu p\u016blam, nevis manu\u0101lai izveidei. Bet k\u0101 j\u016bs varat izmantot pavedienu p\u016blus? Izmantojot <code>Izpild\u012bt\u0101ji<\/code><br>klas\u0113 ir vair\u0101kas statiskas r\u016bpn\u012bcas metodes pavedienu p\u016blu konstru\u0113\u0161anai. Piem\u0113ram <code>newCachedThredPool()<\/code> izveido<br>p\u016blu, kur\u0101 p\u0113c vajadz\u012bbas tiek izveidoti jauni pavedieni un 60 sekundes tiek saglab\u0101ti d\u012bkst\u0101ves pavedieni. Turpret\u012b,<br><code>newFixedThreadPool()<\/code> satur fiks\u0113tu pavedienu kopu, kur\u0101 bezdarb\u012bbas pavedieni tiek glab\u0101ti neierobe\u017eotu laiku.<\/p>\n\n\n\n<p>Apskat\u012bsim, k\u0101 tas var\u0113tu darboties m\u016bsu piem\u0113r\u0101. Tagad pavedieni nav j\u0101veido manu\u0101li. T\u0101 viet\u0101 mums ir j\u0101izveido<br><code>ExecutorService<\/code> kas nodro\u0161ina pavedienu kopfondu. Tad m\u0113s varam tam pie\u0161\u0137irt uzdevumus. P\u0113d\u0113jais solis ir sl\u0113gt pavedienu<br>pool, lai izvair\u012btos no atmi\u0146as nopl\u016bdes. P\u0101r\u0113jais iepriek\u0161\u0113jais kods paliek nemain\u012bgs.<\/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(uzdevums2);\nexecutor.submit(uzdevums3);\n\nexecutor.shutdown();<\/code><\/pre>\n\n\n\n<h3 class=\"wp-block-heading\">Izsaucams<\/h3>\n\n\n\n<p><code>Runnable<\/code> \u0161\u0137iet noder\u012bgs veids, k\u0101 izveidot vienlaic\u012bgus uzdevumus, ta\u010du tam ir viens b\u016btisks tr\u016bkums. Tas nevar atdot nevienu<br>v\u0113rt\u012bba. Turkl\u0101t m\u0113s nevaram noteikt, vai uzdevums ir vai nav pabeigts. M\u0113s ar\u012b nezin\u0101m, vai tas ir pabeigts.<br>parasti vai iz\u0146\u0113muma k\u0101rt\u0101. Risin\u0101jums \u0161\u012bm slim\u012bb\u0101m ir <code>Izsaucams<\/code>.<\/p>\n\n\n\n<p><code>Izsaucams<\/code> ir l\u012bdz\u012bgs <code>Runnable<\/code> t\u0101 ietver ar\u012b asinhronus uzdevumus. Galven\u0101 at\u0161\u0137ir\u012bba ir t\u0101, ka t\u0101 sp\u0113j<br>atgriezt v\u0113rt\u012bbu. Atgriezt\u0101 v\u0113rt\u012bba var b\u016bt jebkura (ne primit\u012bv\u0101) tipa, jo <code>Izsaucams<\/code> saskarne ir parametriz\u0113ts tips.<br><code>Izsaucams<\/code> ir funkcion\u0101la saskarne, kurai ir <code>izsaukt()<\/code> metode, kas var mest <code>Iz\u0146\u0113mums<\/code>.<\/p>\n\n\n\n<p>Tagad apl\u016bkosim, k\u0101 m\u0113s varam izmantot <code>Izsaucams<\/code> m\u016bsu mas\u012bva probl\u0113m\u0101.<\/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, 10, 10};\nint[] a3 = {3, 4, 3, 4, 4, 3, 4, 2, 1, 3, 7};\n\nCallable uzdevums1 = () -&gt; Arrays.stream(a1).sum();\nCallable task2 = () -&gt; Arrays.stream(a2).sum();\nCallable uzdevums3 = () -&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 ir: \" + future1.get());\nSystem.out.println(\"2. Summa ir: \" + future2.get());\nSystem.out.println(\"3. Summa ir: \" + future3.get());\n\nexecutor.shutdown();<\/code><\/pre>\n\n\n\n<p>Labi, m\u0113s varam redz\u0113t, k\u0101 <code>Izsaucams<\/code> tiek izveidots un p\u0113c tam iesniegts <code>ExecutorService<\/code>. Bet kas, pie velna, ir <code>N\u0101kotne<\/code>?<br><code>N\u0101kotne<\/code> darbojas k\u0101 tilts starp pavedieniem. Katra mas\u012bva summa tiek veidota atsevi\u0161\u0137\u0101 pavedien\u0101, un mums ir nepiecie\u0161ams veids, k\u0101<br>sa\u0146emt \u0161os rezult\u0101tus atpaka\u013c uz <code>galvenais()<\/code>.<\/p>\n\n\n\n<p>Lai ieg\u016btu rezult\u0101tu no <code>N\u0101kotne<\/code> mums j\u0101zvana <code>ieg\u016bt()<\/code> metode. \u0160eit var notikt viena no div\u0101m liet\u0101m. Pirmk\u0101rt,<br>apr\u0113\u0137ina rezult\u0101ts, ko veic <code>Izsaucams<\/code> ir pieejams. Tad m\u0113s to sa\u0146emam nekav\u0113joties. Otrk\u0101rt, rezult\u0101ts nav<br>v\u0113l nav gatavs. T\u0101d\u0101 gad\u012bjum\u0101 <code>ieg\u016bt()<\/code> metode tiks blo\u0137\u0113ta, l\u012bdz b\u016bs pieejams rezult\u0101ts.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">ComputableFuture<\/h3>\n\n\n\n<p>Jaut\u0101jums par <code>N\u0101kotne<\/code> ir tas, ka t\u0101 darbojas saska\u0146\u0101 ar \"push paradigmu\". Izmantojot <code>N\u0101kotne<\/code> jums ir j\u0101b\u016bt k\u0101 priek\u0161niekam, kur\u0161<br>past\u0101v\u012bgi jaut\u0101: \"Vai tavs uzdevums ir izpild\u012bts? Vai tas ir gatavs?\", l\u012bdz tas sniedz rezult\u0101tu. Darb\u012bba past\u0101v\u012bga spiediena apst\u0101k\u013cos ir<br>d\u0101rgi. Daudz lab\u0101ka pieeja b\u016btu pas\u016bt\u012bt <code>N\u0101kotne<\/code> ko dar\u012bt, kad tas ir gatavs savam uzdevumam. Diem\u017e\u0113l,<br><code>N\u0101kotne<\/code> to nevar izdar\u012bt, bet <code>ComputableFuture<\/code> var.<\/p>\n\n\n\n<p><code>ComputableFuture<\/code> darbojas \"pull paradigm\u0101\". Kad tas ir izpild\u012bjis savus uzdevumus, m\u0113s varam tam nor\u0101d\u012bt, ko dar\u012bt ar rezult\u0101tu. Tas<br>ir asinhronas pieejas piem\u0113rs.<\/p>\n\n\n\n<p><code>ComputableFuture<\/code> lieliski darbojas ar <code>Runnable<\/code> bet ne ar <code>Izsaucams<\/code>. T\u0101 viet\u0101 ir iesp\u0113jams sniegt uzdevumu, lai<br><code>ComputableFuture<\/code> veid\u0101 <code>Pieg\u0101d\u0101t\u0101js<\/code>.<\/p>\n\n\n\n<p>Apl\u016bkosim, k\u0101 iepriek\u0161 min\u0113tais attiecas uz m\u016bsu probl\u0113mu.<\/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, 10, 10};\nint[] a3 = {3, 4, 3, 4, 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>Pirmais, kas jums p\u0101rsteidz, ir tas, cik daudz \u012bs\u0101ks ir \u0161is risin\u0101jums. Turkl\u0101t tas ar\u012b izskat\u0101s gl\u012bti un k\u0101rt\u012bgi.<\/p>\n\n\n\n<p>Uzdevums <code>PabeidzamsB\u016bt\u012bba<\/code> var nodro\u0161in\u0101t <code>supplyAsync()<\/code> metode, kas izmanto <code>Pieg\u0101d\u0101t\u0101js<\/code> vai <code>RunAsync()<\/code> ka<br>aiz\u0146em <code>Runnable<\/code>. Atgriezenisko zvanu - koda fragmentu, kas j\u0101palai\u017e p\u0113c uzdevuma pabeig\u0161anas - defin\u0113 ar <code>thenAccept()<\/code><br>metode.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Secin\u0101jumi<\/h2>\n\n\n\n<p><strong>Java<\/strong> pied\u0101v\u0101 daudz da\u017e\u0101du pieejas vienlaic\u012bgai darb\u012bbai. \u0160aj\u0101 rakst\u0101 m\u0113s tikai nedaudz piesk\u0101r\u0101mies \u0161ai t\u0113mai.<\/p>\n\n\n\n<p>Tom\u0113r m\u0113s aptv\u0113r\u0101m pamatus par <code>V\u012btne<\/code>, <code>Runnable<\/code>, <code>Izsaucams<\/code>, un <code>CallableFuture<\/code> kas izvirza labu punktu<br>t\u0101l\u0101kai t\u0113mas izp\u0113tei.<\/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>Izlasiet m\u016bsu emu\u0101ru s\u0113rijas pirmo da\u013cu, kas velt\u012bta vienlaic\u012bgai darb\u012bbai programm\u0101 Java. Turpm\u0101kaj\u0101 rakst\u0101 m\u0113s s\u012bk\u0101k apl\u016bkosim at\u0161\u0137ir\u012bbas starp pavedieniem un procesiem, pavedienu baseiniem, izpild\u012bt\u0101jiem un daudz ko citu!<\/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\/lv\/emuars\/vienlaicigums-java-1-dala-ievads\/\" \/>\n<meta property=\"og:locale\" content=\"lv_LV\" \/>\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\/lv\/emuars\/vienlaicigums-java-1-dala-ievads\/\" \/>\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\":\"lv\",\"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\":\"lv\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/thecodest.co\\\/blog\\\/concurrency-in-java-part-1-introduction\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"lv\",\"@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\":\"lv\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/thecodest.co\\\/#organization\",\"name\":\"The Codest\",\"url\":\"https:\\\/\\\/thecodest.co\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"lv\",\"@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\":\"lv\",\"@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\\\/lv\\\/author\\\/thecodest\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Vienlaic\u012bgums Java 1. da\u013c\u0101 - Ievads - The Codest","description":"Izlasiet m\u016bsu emu\u0101ru s\u0113rijas pirmo da\u013cu, kas velt\u012bta vienlaic\u012bgai darb\u012bbai programm\u0101 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\/lv\/emuars\/vienlaicigums-java-1-dala-ievads\/","og_locale":"lv_LV","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\/lv\/emuars\/vienlaicigums-java-1-dala-ievads\/","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":"lv","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":"Vienlaic\u012bgums Java 1. da\u013c\u0101 - Ievads - 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":"Izlasiet m\u016bsu emu\u0101ru s\u0113rijas pirmo da\u013cu, kas velt\u012bta vienlaic\u012bgai darb\u012bbai programm\u0101 Java.","breadcrumb":{"@id":"https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/#breadcrumb"},"inLanguage":"lv","potentialAction":[{"@type":"ReadAction","target":["https:\/\/thecodest.co\/blog\/concurrency-in-java-part-1-introduction\/"]}]},{"@type":"ImageObject","inLanguage":"lv","@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":"lv"},{"@type":"Organization","@id":"https:\/\/thecodest.co\/#organization","name":"The Codest","url":"https:\/\/thecodest.co\/","logo":{"@type":"ImageObject","inLanguage":"lv","@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":"lv","@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\/lv\/author\/thecodest\/"}]}},"_links":{"self":[{"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/posts\/3138","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/comments?post=3138"}],"version-history":[{"count":8,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/posts\/3138\/revisions"}],"predecessor-version":[{"id":8551,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/posts\/3138\/revisions\/8551"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/media\/3139"}],"wp:attachment":[{"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/media?parent=3138"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/categories?post=3138"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/thecodest.co\/lv\/wp-json\/wp\/v2\/tags?post=3138"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}