"Hej, Amigo! Vi har ett nytt och mycket svårt ämne. Jag är ledsen. Det anses ofta vara ett av de mest komplexa ämnena, inte bara i Java, utan också i programmering i allmänhet. Jag pratar om multithreading . "

Föreställ dig ett typiskt datorspel, till exempel ett rymdskeppsracingspel. Du flyger genom kosmos vidder, undviker meteoriter och patrullkryssare. Två dussin andra deltar med dig i dessa illegala lopp.

Låt oss säga att du bestämmer dig för att skriva ett sådant spel. Ditt program måste hålla reda på kommandon (tangentbordsinmatning), flytta rymdskeppen, beräkna deras banor, bestämma konsekvenserna av eventuella kollisioner och rita allt detta på användarens skärm. Detta är mycket komplext arbete.

Kommer du ihåg hur vi löste «problem med stor komplexitet» i exemplet om det växande rederiet?

Vi delade upp det i oberoende avdelningar och specificerade strikt (standardiserade) hur de kunde interagera.

"Men vad gör vi när de oberoende delarna måste utföra en del arbete parallellt med de andra delarna?! Svaret på denna fråga är trådar ."

Försök att föreställa dig ett program som en liten robot som kör runt koden och kör kommandon . Först kör den ett kommando på en rad, flyttar sedan till nästa, och så vidare.

"Jag kan se det i mitt sinne. Piece of cake!"

"Mycket bra. Och föreställ dig nu att du har flera av dessa robotar. Medan en hanterar användarinmatning, uppdaterar en andra objekt baserat på den inmatningen. En tredje kör koden för att visa dessa objekt på skärmen. Flera gånger i sekunden, en fjärde kontrollerar om några fartyg har kolliderat och, om de har kolliderat, beräknar resultatet av kollisionen."

Således kan vi inte bara dela upp programmet i fristående delar/objekt, utan också göra det så att dessa delar kan utföra sitt arbete oberoende av varandra. Ju mindre interaktion mellan de enskilda delarna, desto mindre komplext är programmet.

Föreställ dig att du kunde ersätta chefen med ett manus som skickar brev . Och de andra företagsavdelningarna kunde inte ens säga att det hade skett en förändring. Sånt här hände redan på 2500-talet med utmärkta resultat. De flesta chefer, och till och med högsta chefer, kan framgångsrikt ersättas av ett manus med medelkomplexitet. Först efter att "kontorsplanktonförbundet" ingrep tog massuppsägningarna av chefer ett slut. Men jag avviker.

"Så intressant!"

"Det kan inte bara finnas flera av dessa "små robotar" som exekverar kod, de kan också kommunicera med varandra och skapa nya robotar."

"Skapa nya robotar?"

"Ja, för att utföra nya uppgifter. Ibland är det fördelaktigt att skapa en annan robot (en annan tråd) för att utföra någon åtgärd samtidigt som den nuvarande tråden (robot)."

" Det här låter som en bra sak, men jag kan inte komma på var jag skulle använda det. "

Och varför kallar vi dem " trådar "?

"Föreställ dig att varje robot har olika färger och markerar kommandon med sin färg när den utför dem. Vägen som den lilla roboten tar är som linjen som lämnats efter av en penna. Den här banan sträcker sig bakom roboten, som en tråd bakom en nål."

Varje «liten robot» har en uppgift som den skapades för att utföra. Du kan tänka på en tråd är den uppsättning kommandon som körs när du utför denna uppgift.

Låt oss säga att du flyger på ett rymdskepp för att leverera last. Då är «leverera last» din uppgift, och du är mitt uppe i att utföra den. Och din flygväg är din tråd. Vi skulle kunna säga att varje ny uppgift, varje uppgift som ännu inte är klar, har sin egen tråd (en väg som fortfarande måste korsas).

"Med andra ord, det finns en uppgift och en "liten robot" som utför den. Och en tråd är bara den väg som roboten tar medan den slutför sin uppgift?"

"Exakt."

Det är så det hela fungerar innerst inne. Eftersom datorn bara har en processor kan den bara utföra ett kommando åt gången. Så här är vad som händer: processorn växlar hela tiden mellan trådar. Den växlar till en ny tråd, kör några kommandon, växlar sedan till nästa tråd, kör några kommandon och så vidare. Men eftersom växling mellan trådar sker hundratals gånger per sekund, verkar det som om alla trådar körs samtidigt.

Multithreading - 1