Démonické vlákna v Jave

1. Prehľad

V tomto krátkom článku sa pozrieme na vlákna démonov v prostredí Java a na to, na čo sa dajú použiť. Vysvetlíme tiež rozdiel medzi vláknami démonov a vláknami používateľov.

2. Rozdiel medzi vláknami démonov a používateľov

Java ponúka dva typy vlákien: užívateľské vlákna a vlákna démonov.

Používateľské vlákna sú vlákna s vysokou prioritou. Pred ukončením JVM počká na dokončenie svojej úlohy ľubovoľným vláknom používateľa.

Na druhej strane, vlákna démona sú vlákna s nízkou prioritou, ktorých jedinou úlohou je poskytovať služby vláknam používateľov.

Pretože vlákna démona sú určené na obsluhu vlákien používateľov a sú potrebné iba vtedy, keď sú vlákna používateľov spustené, nezabránia tomu, aby sa JVM ukončil po dokončení všetkých vlákien používateľa.

Preto nekonečné slučky, ktoré zvyčajne existujú v vláknach démona, nespôsobia problémy, pretože akýkoľvek kód vrátane konečne bloky, nebudú vykonané po dokončení všetkých používateľských vlákien. Pre tento dôvod, vlákna démonov sa pre vstupno-výstupné úlohy neodporúčajú.

Z tohto pravidla však existujú výnimky. Zle navrhnutý kód v vláknach démona môže zabrániť výstupu JVM. Napríklad telefonovanie Thread.join () na bežiacom vlákne démona môže zablokovať vypnutie aplikácie.

3. Použitie vlákien démona

Vlákna démona sú užitočné na pozadí podporujúcich úloh, ako je zber odpadu, uvoľňovanie pamäte nepoužívaných objektov a odstraňovanie nežiaducich položiek z medzipamäte. Väčšina vlákien JVM sú vlákna démonov.

4. Vytvorenie vlákna démona

Ak chceme, aby sa vlákno stalo vláknom démona, musíme iba zavolať Thread.setDaemon (). V tomto príklade použijeme NewThread trieda, ktorá rozširuje Závit trieda:

NewThread daemonThread = nový NewThread (); daemonThread.setDaemon (true); daemonThread.start ();

Akékoľvek vlákno dedí stav démona vlákna, ktoré ho vytvorilo. Pretože hlavným vláknom je vlákno používateľa, akékoľvek vlákno, ktoré je vytvorené v hlavnej metóde, je predvolene vlákno používateľa.

Metóda setDaemon () možno volať až po Závit objekt bol vytvorený a vlákno nebolo spustené. Pokus o volanie setDaemon () zatiaľ čo vlákno beží, vyhodí znak IllegalThreadStateException:

@Test (očakáva sa = IllegalThreadStateException.class) public void whenSetDaemonWhileRunning_thenIllegalThreadStateException () {NewThread daemonThread = new NewThread (); daemonThread.start (); daemonThread.setDaemon (true); }

5. Kontrola, či je vlákno démonovým vláknom

Nakoniec na kontrolu, či je vlákno démonovým vláknom, môžeme metódu jednoducho zavolať isDaemon ():

@Test public void whenCallIsDaemon_thenCorrect () {NewThread daemonThread = new NewThread (); NewThread userThread = nový NewThread (); daemonThread.setDaemon (true); daemonThread.start (); userThread.start (); assertTrue (daemonThread.isDaemon ()); assertFalse (userThread.isDaemon ()); }

6. Záver

V tomto rýchlom návode sme v niekoľkých praktických scenároch videli, čo sú vlákna démonov a na čo sa dajú použiť.

Plná verzia kódu je ako vždy k dispozícii na GitHub.