Jako backendový inženýr čelíme situacím, kdy musíme data zpracovávat asynchronně. Dnes se podíváme, jak se to dělá v Javě a různé způsoby, jak to udělat.

Thread

Úplně základní, ale tak výkonná součást souběžnosti Java je Thread. Vlákno Java je ve skutečnosti spojeno s vláknem operačního systému. Úplně základní způsob, jak vytvořit a Thread je rozšířením a přepsáním run :

Spuštění vlákna způsobí run() být volán.
Můžete se zeptat; ano, vlákno má spoustu dalších metod, které lze přepsat:

  • Ve většině případů nechceme přepsat jiné metody vlákna.
  • Jakmile prodloužíme Thread třída, rozšiřující třída ztrácí svou schopnost se dále rozšiřovat, protože Java nepodporuje vícenásobnou dědičnost.
  • Každé vlákno má svůj vlastní objekt, když jej prodlužujeme, a není dobré pro zdraví paměti, když je jich tuny Objects of the extended Thread vytvořené.

Java řeší tyto problémy pomocí rozhraní Runnable. Ve skutečnosti, Thread má přetíženou metodu, která bere Runnable.

Runnable

Runnable je rozhraní, které má pouze jednu metodu: run(). Ano, Runnable je funkční rozhraní a jeho instanci lze vytvořit pomocí funkce lambda. Přesto je to snadný způsob, jak toho dosáhnout; u složitých věcí bychom to možná rádi implementovali. Podívejte se na rozdíl zde. Vše je o požadavku:

Ačkoli Runnable má a run(), není to vlákno, ale pouze třída Java, dokud ji nepřevezme řízení (předáno) vláknu. Spuštění vlákna způsobí spuštění spustitelného objektu run() být volán.

Jo, Java to vyřešila ve verzi 1.5 a je to Callable.

Callable<V>

Callable je generické rozhraní. Proč? Spusťte tento příkaz s návratovou hodnotou jako obecný spusťte tento příkaz. Callable je příliš funkční rozhraní a call() je jediná metoda, metoda bez argumentů, která vyvolá výjimku a vrátí hodnotu obecného spuštění tohoto příkazu.

Implementace Callable je velmi podobná Runnable:

Viz zde, volání zpracovává data a vrací hodnotu, kterou lze shromáždit po provedení. Je ale velký rozdíl v jeho vyvolání? Používáme ExecutorService vyvolat a Future udržet výsledek. Pojďme si promluvit proč.

Jak můžete vidět, neexistuje žádné kontrolované chování při vytváření a spouštění vláken (také Runnable nebo Callable). Můžeme chtít řídit počet vláken spuštěných najednou, protože každé z nich je spojeno s vlákny OS. Počet vláken, která spustíme, by měl být menší než počet dostupných jader CPU. Dohromady to Java řeší ExecutorService rozhraní.
Výše je informační článek o Asynchronní programování v Javě: Část I.
Neváhejte nás kontaktovat prostřednictvím sekce komentářů, pokud máte nějaké dotazy týkající se pokynů, které jsme sdíleli výše.