programare multithreaded în Java 8

programare multithreaded în Java 8
programare multithreaded în Java 8

Bine ați venit în prima parte a programării paralele în ghidul Java 8. În această parte, considerăm exemple simple de modul în care să execute cod în paralel cu fire, sarcini și prestatori de servicii.

Pentru prima dată Simultaneitatea API a fost introdus odată cu lansarea de Java 5 și de atunci a evoluat cu fiecare nouă versiune de Java. Cele mai multe dintre exemplele pot fi puse în aplicare în versiunile mai vechi, dar în acest articol am de gând să folosească o expresie lambda. Dacă nu sunt încă familiarizați cu inovațiile Java 8, recomand sa se uite la ghidul meu.

Fluxuri și sarcini

Toate sistemele de operare moderne sprijină executarea în paralel a codului folosind procesele și firele. Procesul - o instanță a unui program care rulează independent de celelalte. De exemplu, atunci când executați un program în Java, sistemul de operare creează un nou proces care se desfășoară în paralel cu celelalte. În interiorul proceselor pe care le folosim fluxuri, astfel, pentru a stoarce capacitatea maximă a procesorului.

Curente (fire), sprijinite în Java deoarece JDK 1.0. Înainte de a începe un fir, este necesar să se prevadă o bucată de cod, care este de obicei numit „obiectiv» (sarcina). Acest lucru se face prin implementarea interfeței Runnable. care are doar o singură metodă fără argumente, se întoarce nule - run (). Aici este un exemplu de modul în care funcționează:

Când executați acest cod, veți vedea o întârziere între producția de prima și a doua linie de pe ecran. TIMEUNIT - o clasă de util pentru lucrul cu unități de timp, dar același lucru se poate face cu Thread.sleep (1000).

Să ne acum să ia o privire mai atentă una dintre cele mai importante părți ale API Simultaneitatea - implementarea serviciului (servicii executor).

artiști

Simultaneitatea API introduce conceptul de serviciu al executiv (ExecutorService) - un înlocuitor la nivel înalt, cu fire direct. Artiștii folosesc efectua sarcini asincronă și, de obicei, un bazin de fir, astfel încât nu avem nevoie să le creați manual. Toate firele în piscină pentru a fi reutilizat după sarcină, ceea ce înseamnă că putem crea cât mai multe sarcini în cerere, așa cum ne-o dorim, folosind un singur interpret.

Iată cum va arăta primul nostru exemplu folosind artist:

ExecutorService executor = Executorilor. newSingleThreadExecutor ();

executor. submit (() ->

String threadName = fir. currentThread (). getName ();

Sistem. out. println ( "Bună" + threadName);

// => Hello pool-1-thread-1

clasa Executorii oferă metode convenabile de fabrică pentru a crea diverse servicii artiști. În acest caz, am folosit un interpret cu un singur fir.

Rezultatul arata la fel ca și ultima dată. Dar acest cod este o diferență importantă - niciodată nu se va opri. punerea în aplicare lucrările necesare pentru a finaliza în mod clar. Pentru a face acest lucru, interfață ExecutorService are două metode: de închidere (). care așteaptă sarcinile de funcționare, și shutdownNow (). care se oprește cantaretul imediat.

Iată cum prefer să opresc cântăreți:

In exemplul de mai sus am folosit un alt tip de interpreți, care este creat prin metoda newWorkStealingPool (). Această metodă a apărut în Java 8, și nu se comportă ca și celălalt: în loc de a folosi un număr fix de fire creează ForkJoinPool cu ​​un paralelism anumit (dimensiune paralelism). implicit la numărul de nuclee de mașini.

ForkJoinPool a introdus pentru prima dată în Java 7, iar noi îl vom examina mai în detaliu în următoarele secțiuni ale managementului nostru. Acum, să ne uităm la interpreții cu un planificator (executorii programate).

Artisti cu un planificator

Știm deja cum să dea sarcina de a Executivului și a obține rezultatul. Pentru a rula periodic sarcina, putem folosi piscina fir de la un planificator.

ScheduledExecutorService ori capabile de a rula sarcini o dată sau de mai multe la un interval predeterminat.

Acest exemplu arată cum să obțineți cântăreață de a efectua o activitate după trei secunde:

articole similare