Som backend-ingeniør står vi overfor situasjoner for å behandle dataene asynkront. La oss i dag se hvordan det gjøres i java og forskjellige måter å gjøre det på.

Thread

Den helt grunnleggende, men så kraftige komponenten i Java samtidighet er Thread. The Thread of Java er faktisk assosiert med Thread of the Operating System. Den helt grunnleggende måten å lage en Thread er ved å utvide den og overstyre run :

Å starte tråden forårsaker run() å bli kalt.
Du kan spørre; ja, tråden har mange andre metoder som kan overstyres:

  • I de fleste tilfeller ønsker vi ikke å overstyre andre metoder for tråden.
  • Når vi utvider Thread klasse, mister den utvidende klassen sin evne til å utvide seg lenger ettersom Java ikke støtter flere arv.
  • Hver tråd har sitt eget objekt når vi utvider det, og det er ikke bra for hukommelseshelsen når det er tonnevis med Objects of the extended Thread opprettet.

Java løser disse problemene med Runnable-grensesnittet. Faktisk, Thread har en overbelastet metode som tar Runnable.

Runnable

Runnable er et grensesnitt som bare har én metode: run(). Ja, Runnable er et funksjonelt grensesnitt, og dets forekomst kan opprettes med lambda-funksjonen. Likevel er det en enkel måte å gjøre dette på; for komplekse ting, kan vi gjerne implementere det. Se forskjellen her. Alt handler om kravet:

Selv om Runnable har en run(), det er ikke en tråd, men bare en Java-klasse til den er overtatt av (overført til) tråd. Starten av tråden forårsaker det kjørbare objektets run() å bli kalt.

Jepp, Java fikk det løst i versjon 1.5, og det er Callable.

Callable<V>

Callable er et generisk grensesnitt. Hvorfor? Kjør denne kommandoen for returverdien som den generiske kjør denne kommandoen. Callable er også et funksjonelt grensesnitt og call() er den eneste metoden, en metode uten argumenter som kaster unntak og returnerer generisk kjøre denne kommandoverdien.

Implementeringen av Callable er veldig lik Runnable:

Se her, anropet behandler dataene og returnerer en verdi som kan samles inn etter utførelse. Men er det stor forskjell på å påkalle det? Vi bruker ExecutorService å påberope seg og Future for å beholde resultatet. La oss snakke om hvorfor.

Som du kan se, er det ingen kontrollert oppførsel for å opprette og kjøre trådene (kan også kjøres eller ringes). Det kan være lurt å kontrollere antall tråder som kjører om gangen, da hver av dem er knyttet til OSs tråder. Antall tråder vi kjører bør være mindre enn antall tilgjengelige CPU-kjerner. Alt sammen løser Java det ved ExecutorService grensesnitt.
Ovenfor er en informasjonsartikkel om Asynkron programmering i Java: Del I.
Ta gjerne kontakt med oss ​​via kommentarfeltet, i tilfelle du har spørsmål angående instruksjonene vi delte ovenfor.