Som backend-ingeniør står vi over for situationer, hvor vi behandler dataene asynkront. Lad os i dag se, hvordan det gøres i java og forskellige måder at gøre det på.

Thread

Den meget grundlæggende, men så kraftfulde komponent i Java samtidighed er Thread. Javas tråd er faktisk forbundet med tråden i operativsystemet. Den helt grundlæggende måde at skabe en Thread er ved at forlænge den og tilsidesætte run :

Start af tråden forårsager run() at blive kaldt.
Du kan spørge; ja, tråden har tonsvis af andre metoder, der kan tilsidesættes:

  • I de fleste tilfælde ønsker vi ikke at tilsidesætte andre metoder i tråden.
  • Når vi forlænger Thread klasse, mister den udvidende klasse sin evne til at udvide yderligere, da Java ikke understøtter flere nedarvninger.
  • Hver tråd har sit eget objekt, når vi forlænger det, og det er ikke godt for hukommelsen, når der er tonsvis af Objects of the extended Thread oprettet.

Java løser disse problemer med Runnable-grænsefladen. Faktisk, Thread har en overbelastet metode, der tager Runnable.

Runnable

Runnable er en grænseflade, der kun har én metode: run(). Ja, Runnable er en funktionel grænseflade, og dens instans kan oprettes med lambda-funktionen. Alligevel er det en nem måde at gøre dette på; for komplekse ting, vil vi måske gerne implementere det. Se forskellen her. Det hele handler om kravet:

Selvom Runnable har en run(), det er ikke en tråd, men bare en Java-klasse, indtil den er overtaget af (overført til) tråd. Starten af ​​tråden forårsager det løbbare objekts run() at blive kaldt.

Jep, Java fik det løst i version 1.5, og det er Callable.

Callable<V>

Callable er en generisk grænseflade. Hvorfor? Kør denne kommando af returværdien som den generiske kør denne kommando. Callable er også en funktionel grænseflade og call() er den eneste metode, en metode uden argumenter, der kaster Undtagelse og returnerer generisk kør denne kommandoværdi.

Implementeringen Callable ligner meget Runnable:

Se her, opkaldet behandler dataene og returnerer en værdi, der kan indsamles efter udførelse. Men er der stor forskel på at påberåbe sig det? Vi bruger ExecutorService at påberåbe sig og Future at holde resultatet. Lad os tale om hvorfor.

Som du kan se, er der ingen kontrolleret adfærd ved at oprette og køre trådene (også kan køres eller kaldes). Vi ønsker måske at kontrollere antallet af tråde, der kører ad gangen, da hver af dem er forbundet med OS’s tråde. Antallet af tråde, vi kører, bør være mindre end antallet af tilgængelige CPU-kerner. Alt sammen løser Java det ved ExecutorService interface.
Ovenfor er en oplysende artikel om Asynkron programmering i Java: Del I.
Du er velkommen til at kontakte os via kommentarfeltet, hvis du har spørgsmål vedrørende instruktionerne, vi delte ovenfor.