"Bună ziua, Amigo! Avem un subiect nou și foarte dificil. Îmi pare rău. Este adesea considerat unul dintre cele mai complexe subiecte nu numai în Java, ci și în programare în general. Vorbesc despre multithreading . "

Imaginați-vă un joc de calculator tipic, de exemplu, un joc de curse cu nave spațiale. Zburați prin întinderile cosmosului, evitând meteoriți și crucișătoare de patrulare. Alți două duzini participă cu tine la aceste curse ilegale.

Să presupunem că te hotărăști să scrii un astfel de joc. Programul tău va trebui să țină evidența comenzilor (intrare de la tastatură), să mute navele spațiale, să calculeze traiectoriile acestora, să determine consecințele oricăror coliziuni și să deseneze toate acestea pe ecranul utilizatorului. Aceasta este o muncă foarte complexă.

Vă amintiți cum am rezolvat „problema de mare complexitate” în exemplul despre compania de transport maritim în creștere?

L-am împărțit în departamente independente și am specificat rigid (standardizat) cum ar putea interacționa.

"Dar ce facem atunci când părțile independente trebuie să efectueze unele lucrări în paralel cu celelalte părți?! Răspunsul la această întrebare este firele de execuție ."

Încercați să vă imaginați un program ca un robot mic care rulează în jurul codului și execută comenzi . Mai întâi, execută o comandă pe o linie, apoi trece la următoarea și așa mai departe.

"Îmi văd în minte. Bucătă de tort!"

„Foarte bine. Și acum imaginați-vă că aveți câțiva dintre acești roboți. În timp ce unul se ocupă de intrarea utilizatorului, un al doilea actualizează obiectele pe baza acelei intrări. Un al treilea execută codul pentru a afișa aceste obiecte pe ecran. De câteva ori pe secundă, un al patrulea verifică dacă vreo nave s-au ciocnit și, dacă au făcut-o, calculează rezultatele coliziunii.”

Astfel, nu putem doar să împărțim programul în părți/obiecte independente, ci și să îl facem astfel încât aceste părți să își poată îndeplini munca independent una de cealaltă. Cu cât interacțiunea dintre părțile individuale este mai mică, cu atât programul este mai puțin complex.

Imaginați- vă că ați reușit să înlocuiți managerul cu un script care trimite scrisori . Iar celelalte departamente ale companiei nici măcar nu au putut spune că a avut loc o schimbare. Acest gen de lucruri s-au întâmplat încă din secolul al 26-lea, cu rezultate excelente. Majoritatea managerilor, și chiar a directorilor de top, pot fi înlocuiți cu succes cu un scenariu de complexitate medie. Abia după ce a intervenit „uniunea de plancton de birou” s-au încheiat concedierile în masă ale managerilor. Dar mă abat.

"Ce interesant!"

„Nu numai că pot exista câțiva dintre acești „micuți roboți” care execută cod, ei pot, de asemenea, comunica între ei și pot genera noi roboți.”

„Dă naștere roboți noi?”

"Da, pentru a efectua sarcini noi. Uneori este avantajos să creați un alt robot (un alt fir) pentru a efectua o acțiune în același timp cu firul curent (robot)."

Acesta pare un lucru bun, dar nu mă pot gândi unde l-aș folosi.

Și de ce le numim „ fire ”?

„Imaginați-vă că fiecare robot are o culoare diferită și marchează comenzile cu culoarea sa pe măsură ce le execută. Drumul urmat de robotul mic este ca linia lăsată în urmă de un creion. Această cale se întinde în spatele robotului, ca un fir în spate . un ac."

Fiecare „robot mic” are o sarcină pentru care a fost creat. Vă puteți gândi la un fir este setul de comenzi executate în timpul efectuării acestei sarcini.

Să presupunem că zburați pe o navă spațială pentru a livra mărfuri. Atunci, „livrarea mărfurilor” este sarcina ta și ești în mijlocul ei. Iar calea ta de zbor este firul tău. Am putea spune că fiecare sarcină nouă, fiecare sarcină încă neterminată, are propriul său fir (o cale care mai trebuie parcursă).

"Cu alte cuvinte, există o sarcină și un "mic robot" care o execută. Și un fir este doar calea parcursă de robot în timp ce își finalizează sarcina?"

"Exact."

Așa funcționează totul în adâncul interiorului. Deoarece computerul are un singur procesor, poate executa o singură comandă la un moment dat. Iată ce se întâmplă: procesorul comută constant între fire. Trece la un fir nou, execută câteva comenzi, apoi trece la următorul thread, execută câteva comenzi și așa mai departe. Dar, deoarece comutarea între fire are loc de sute de ori pe secundă, ni se pare că toate firele rulează simultan.

Multithreading - 1