Multithreading - primii pași

Multithreading - primii pași

Când întrebarea despre multithreading este atinsă de interviu, mă simt extrem de incomod. Și nu pentru că nu știu bine acest subiect - cred că înțeleg destul de bine. Dar sfințul tremur și misterul, cu care această zonă a cunoașterii este învăluită, mă deranjează. Pentru că, deși este dificil, dar de înțeles. Dar interlocutorii pot căuta (și găsi) semnificații și trăsături complet diferite. Nu poți să fii de acord cu opinia :).






Dacă înțelegeți ce anume cauzează complexitatea și ce instrumente vă sunt oferite, atunci problema nu mai există în multithreading, ci în complexitatea gestionării sarcinilor pentru care este utilizată. Ne împărțim narațiunea în mai multe părți:

  1. De ce am nevoie de multithreading?
  2. Cum se creează fire
  3. Ce probleme apar și de ce
  4. Instrumente pentru rezolvarea problemelor

Recunosc complet că percepția mea este subiectivă și că unele momente și subtilități nu pot intra în această descriere. Pur și simplu pentru că cu cât mai mult vă scufundați în această problemă, cu atât veți găsi mai multe puncte interesante (la nivelul implementării JVM sau la nivelul arhitecturii procesoarelor). De asemenea, este necesar să se ia în considerare faptul că natura sarcinilor care sunt rezolvate este de asemenea afectată - la urma urmei, atunci când rezolvăm probleme, întâlnim orice limitări, caracteristici ale implementării și alte momente dificile.

De ce este multithreading?

Răspunsul la această întrebare nu este o problemă. Astăzi, numărul de procesoare din sistemele de servere este mai mare decât unul, și chiar un procesor are mai multe nuclee. Am trădat asta cu un exemplu. Fii atent - clasa este in pachetul edu.javacourse.threads

Nu intrăm în detalii încă - trebuie doar să rulați acest exemplu minunat, dar înainte de asta vă sfătuiesc să începeți sarcina managerului pentru a vedea sarcina procesoarelor. Aceasta este imaginea pe care o am.

Multithreading - primii pași

Fluxurile permit executarea manuală a mai multor sarcini într-o singură aplicație. În forma cea mai simplă, există întotdeauna un fir principal în interiorul unei aplicații. Întotdeauna. Dar noi trebuie să ne purtăm noi fire. Și lansarea nu este cea mai dificilă. Cel mai dificil este să-i aduci să lucreze împreună. Dar vom vorbi despre asta mai târziu. Între timp, hai să învățăm cum să executați fire.

Cum se creează fire







Pentru a porni firele (puteți zâmbi), există o clasă specială - Thread. De asemenea, există două interfețe suplimentare, dar cum să lucrăm cu ele, vom analiza mai târziu. Să scriem cea mai simplă aplicație și să o analizăm în detaliu.

Mai întâi propun să analizez codul clasei SimpleRunnable. După cum puteți vedea, nu diferă foarte mult de cazul anterior - diferența este că nu moștenim din clasa Thread. și să implementeze interfața Runnable. O metodă care este înlocuită este exact aceeași cu cea precedentă. diferențele sunt minime.
Acum, să acordăm atenție clasei SimpleThreadManager. După cum vedem aici, folosim un algoritm de declanșare a debitului ușor diferit. Mai întâi, vom crea un obiect SimpleRunnable. apoi creați un obiect de clasă Thread. care în constructorul nostru ne trece obiectul. Apoi vom numi metoda de pornire. În momentul în care este apelat startul, clasa Thread verifică dacă obiectul care implementează interfața Runnable i-a fost transferat în proiectant. Dacă da, atunci se execută metoda de rulare a obiectului trecut. Dacă nu, obiectul Thread va executa metoda de rulare. În general, este destul de ușor.
Puteți gândi - și de ce ați creat interfața atunci când există o clasă numită Thread. Răspunsul este, în general, evident - în flexibilitate extremă. La urma urmei, în acest caz, orice clasă poate rula într-un fir separat. Ie putem crea o clasă pentru un calcul complex - de exemplu, pentru a calcula rentabilitatea lucrărilor /
achiziții / etc în baza contractului. Acest lucru merge la baza de date și unele fișiere, eventual cereri externe către alte sisteme. În general - o lungă perioadă de timp. Și astfel de contracte de piese 40. Acum putem începe calculul mai multor contracte în paralel și, în același timp, această clasă complexă nu ar trebui să fie moștenitorul Thread-ului.

Transferul parametrilor

Ca temă, încercați să scrieți un formular care "rulează" în jurul ecranului de la stânga la dreapta (sau de sus în jos) și când ajunge la limită, începe să se miște în direcția opusă.

Acum putem continua cu următoarea parte a narațiunii multithreading care te va conduce în lumea ororilor care se răcesc în sânge care apar atunci când lucrează împreună mai multe fire :)).

Mulțumesc. Am completat articolul - acum conține ceea ce am vrut. Dar multithreading pe acest articol nu se va termina - există multe lucruri interesante.

Deci, procesorul însuși alege modul de paralelizare a proceselor într-un mediu cu mai multe fire?

Totul este foarte dificil și eu însumi nu pot spune exact totul. În esență, firele sunt obiecte ale sistemului de operare (Windows, Linux). JVM creează fire ca obiecte ale sistemului de operare și, într-o oarecare măsură, le controlează. Dar sistemul de operare în sine face acest lucru și este că "încarcă" procesorul cu sarcini și fire.
Pentru a fi sincer - nu am fost atât de adânc scufundat în JVM pentru a răspunde în detaliu. Recunosc complet că chiar și în aceste rânduri am confundat ceva.

Bună ziua, puteți să explicați exact prima aplicație în cazul în care comparați activitatea de calcul în 1 fir și în multithreading. În special, clasa BigTaskManyThreads.

Lucrul cu firele este în cele din urmă controlat de sistemul de operare și Linux o face diferit decât Windows. Deci, astfel de opțiuni sunt posibile - Linux încearcă să nu lase un proces să încarce toate procesoarele foarte mult.

"A făcut acest lucru ca un parametru pentru constructor, dar puteți, de asemenea, să-l faceți prin apelurile setter (vă sugerez să implementați această opțiune pe cont propriu - este ușor)".
Este ușor, dar pentru un începător să facă fără nici un indiciu, o treabă excelentă de a aprofunda înțelegerea și de a consolida materialul care a fost anterior urmărit.

IMPORTANT. Când lucrați cu localizare există un punct - dacă intenționați să utilizați litere rusești, atunci nu puteți scrie direct.
În primul rând, aceiași NetBeans monitorizează automat această situație. IDEA prea - adevărul pe care trebuie să-l spună despre asta în setări.







Articole similare

Trimiteți-le prietenilor: