Ako backendový inžinier čelíme situáciám, pri ktorých spracovávame údaje asynchrónne. Dnes sa pozrime, ako sa to robí v jave a rôznymi spôsobmi, ako to urobiť.

Thread

Úplne základnou, ale tak výkonnou súčasťou súbežnosti Java je Thread. Vlákno Java je v skutočnosti spojené s vláknom operačného systému. Úplne základný spôsob, ako vytvoriť a Thread je jeho rozšírením a prepísaním run :

Spustenie vlákna spôsobuje run() byť zavolaný.
Môžete sa opýtať; áno, vlákno má veľa ďalších metód, ktoré možno prepísať:

  • Vo väčšine prípadov nechceme prepísať iné metódy vlákna.
  • Akonáhle predĺžime Thread trieda, rozširujúca trieda stráca svoju schopnosť rozširovať sa ďalej, pretože Java nepodporuje viacnásobné dedičstvo.
  • Každé vlákno má svoj vlastný objekt, keď ho predĺžime, a nie je to dobré pre zdravie pamäte, keď je ich veľa Objects of the extended Thread vytvorené.

Java rieši tieto problémy pomocou rozhrania Runnable. V skutočnosti, Thread má preťaženú metódu, ktorá trvá Runnable.

Runnable

Runnable je rozhranie, ktoré má iba jednu metódu: run(). Áno, Runnable je funkčné rozhranie a jeho inštanciu je možné vytvoriť pomocou funkcie lambda. Napriek tomu je to jednoduchý spôsob, ako to urobiť; pri zložitých veciach by sme to možno chceli implementovať. Tu vidíte rozdiel. Všetko je to o požiadavke:

Hoci Runnable má a run(), nie je to vlákno, ale iba trieda Java, kým ju neprevezme riadenie (prejde do) vlákno. Spustenie vlákna spôsobí spustiteľný objekt run() byť zavolaný.

Áno, Java to vyriešila vo verzii 1.5 a je to Callable.

Callable<V>

Callable je všeobecné rozhranie. prečo? Spustite tento príkaz s návratovou hodnotou ako všeobecný príkaz. Volateľné je príliš funkčné rozhranie a call() je jediná metóda, metóda bez argumentov, ktorá vyvolá výnimku a vráti hodnotu generického spustenia tohto príkazu.

Implementácia Callable je veľmi podobná Runnable:

Pozri tu, volanie spracuje údaje a vráti hodnotu, ktorú je možné zhromaždiť po vykonaní. Je však obrovský rozdiel v jej vyvolaní? Používame ExecutorService vyvolať a Future udržať výsledok. Povedzme si prečo.

Ako môžete vidieť, neexistuje žiadne kontrolované správanie pri vytváraní a spúšťaní vlákien (tiež spustiteľných alebo volateľných). Možno budeme chcieť kontrolovať počet vlákien spustených naraz, pretože každé z nich je spojené s vláknami OS. Počet vlákien, ktoré spúšťame, by mal byť menší ako počet dostupných jadier CPU. Spolu to Java rieši ExecutorService rozhranie.
Vyššie je informačný článok o Asynchrónne programovanie v jazyku Java: Časť I.
Neváhajte nás kontaktovať prostredníctvom sekcie komentárov, ak máte nejaké otázky týkajúce sa pokynov, ktoré sme zdieľali vyššie.