"Hei, Amigo! Vi har et nytt og veldig vanskelig emne. Jeg beklager. Det regnes ofte som et av de mest komplekse emnene, ikke bare i Java, men også i programmering generelt. Jeg snakker om multithreading . "

Se for deg et typisk dataspill, for eksempel et romskip-racingspill. Du flyr gjennom kosmos vidder, unnviker meteoritter og patruljekryssere. To dusin andre deltar sammen med deg i disse ulovlige løpene.

La oss si at du bestemmer deg for å skrive et slikt spill. Programmet ditt må holde styr på kommandoer (tastaturinndata), flytte romskipene, beregne banene deres, bestemme konsekvensene av eventuelle kollisjoner og tegne alt dette på brukerens skjerm. Dette er svært komplekst arbeid.

Husker du hvordan vi løste «problem med stor kompleksitet» i eksemplet om det voksende rederiet?

Vi delte det inn i uavhengige avdelinger og spesifiserte (standardisert) strengt hvordan de kunne samhandle.

"Men hva gjør vi når de uavhengige delene må utføre noe arbeid parallelt med de andre delene?! Svaret på dette spørsmålet er tråder ."

Prøv å se for deg et program som en liten robot som løper rundt koden og utfører kommandoer . Først utfører den en kommando på én linje, deretter flytter den til neste, og så videre.

"Jeg kan se det i tankene mine. Piece of cake!"

"Veldig bra. Og se for deg at du har flere av disse robotene. Mens en håndterer brukerinndata, oppdaterer en andre objekter basert på den inngangen. En tredje kjører koden for å vise disse objektene på skjermen. Flere ganger i sekundet, en fjerde sjekker om noen skip har kollidert og, hvis de har kollidert, beregner resultatene av kollisjonen."

Dermed kan vi ikke bare dele opp programmet i selvstendige deler/objekter, men også gjøre det slik at disse delene kan utføre arbeidet sitt uavhengig av hverandre. Jo mindre interaksjon mellom de enkelte delene, jo mindre komplekst er programmet.

Tenk deg at du var i stand til å erstatte lederen med et skript som sender brev . Og de andre bedriftsavdelingene var ikke engang i stand til å fortelle at det hadde skjedd en endring. Denne typen ting skjedde så tidlig som på 2500-tallet med utmerkede resultater. De fleste ledere, og til og med toppledere, kan med hell erstattes av et skript med gjennomsnittlig kompleksitet. Først etter at «kontorplanktonforbundet» grep inn, ble det slutt på masseoppsigelsene av ledere. Men jeg avviker.

"Hvor interessant!"

"Ikke bare kan det være flere av disse "små robotene" som utfører kode, de kan også kommunisere med hverandre og skape nye roboter."

"Gir nye roboter?"

"Ja, for å utføre nye oppgaver. Noen ganger er det fordelaktig å lage en annen robot (en annen tråd) for å utføre en handling samtidig med den nåværende tråden (robot)."

" Dette høres ut som en god ting, men jeg kan ikke tenke på hvor jeg skal bruke det. "

Og hvorfor kaller vi dem « tråder »?

"Tenk deg at hver robot har en forskjellig farge, og markerer kommandoer med sin farge når den utfører dem. Banen som den lille roboten tar er som linjen etterlatt av en blyant. Denne banen strekker seg bak roboten, som en tråd bak en nål."

Hver «liten robot» har en oppgave som den ble laget for å utføre. Du kan tenke på en tråd er settet med kommandoer som utføres mens du utfører denne oppgaven.

La oss si at du flyr på et romskip for å levere last. Da er «levere last» din oppgave, og du er midt i å utføre den. Og flyveien din er tråden din. Vi kan si at hver ny oppgave, hver oppgave som ennå ikke er fullført, har sin egen tråd (en sti som fortsatt må krysses).

"Med andre ord, det er en oppgave og en "liten robot" som utfører den. Og en tråd er bare veien som roboten tar mens den fullfører oppgaven?

"Nøyaktig."

Det er slik det hele fungerer innerst inne. Siden datamaskinen bare har én prosessor, kan den bare utføre én kommando om gangen. Så her er hva som skjer: Prosessoren bytter hele tiden mellom tråder. Den bytter til en ny tråd, utfører noen få kommandoer, bytter deretter til neste tråd, utfører noen få kommandoer og så videre. Men siden veksling mellom tråder skjer hundrevis av ganger per sekund, ser det ut til at alle trådene kjører samtidig.

Multithreading - 1