Daemon Threads in Java

1. Overzicht

In dit korte artikel zullen we daemon-threads in Java bekijken en zien waarvoor ze kunnen worden gebruikt. We zullen ook het verschil uitleggen tussen daemon-threads en gebruikersthreads.

2. Verschil tussen Daemon en User Threads

Java biedt twee soorten threads: gebruikersthreads en daemon-threads.

Gebruikersthreads zijn threads met hoge prioriteit. De JVM wacht tot een gebruikersthread zijn taak heeft voltooid voordat deze wordt beëindigd.

Aan de andere kant, daemon-threads zijn threads met lage prioriteit waarvan de enige rol is het leveren van services aan gebruikersthreads.

Aangezien daemon-threads bedoeld zijn om gebruikersthreads te bedienen en alleen nodig zijn terwijl gebruikersthreads actief zijn, zullen ze niet voorkomen dat de JVM wordt afgesloten zodra alle gebruikersthreads hun uitvoering hebben voltooid.

Dat is de reden waarom oneindige lussen, die meestal voorkomen in daemon-threads, geen problemen zullen veroorzaken, omdat elke code, inclusief de Tenslotte blokken, worden niet uitgevoerd zodra alle gebruikersthreads hun uitvoering hebben voltooid. Om deze reden, daemon-threads worden niet aanbevolen voor I / O-taken.

Er zijn echter uitzonderingen op deze regel. Slecht ontworpen code in daemon-threads kan voorkomen dat de JVM wordt afgesloten. Bijvoorbeeld bellen Thread.join () op een actieve daemon-thread kan het afsluiten van de applicatie blokkeren.

3. Gebruik van Daemon Threads

Daemon-threads zijn handig voor ondersteunende taken op de achtergrond, zoals garbage collection, het vrijmaken van geheugen van ongebruikte objecten en het verwijderen van ongewenste items uit de cache. De meeste JVM-threads zijn daemon-threads.

4. Een daemon-discussielijn maken

Om een ‚Äč‚Äčthread in te stellen als een daemon-thread, hoeven we alleen maar Thread.setDaemon (). In dit voorbeeld gebruiken we de NewThread klasse die de extensie Draad klasse:

NewThread daemonThread = nieuwe NewThread (); daemonThread.setDaemon (true); daemonThread.start ();

Elke thread neemt de daemon-status over van de thread die deze heeft gemaakt. Aangezien de hoofdthread een gebruikersthread is, is elke thread die binnen de main-methode wordt gemaakt, standaard een user thread.

De methode setDaemon () kan alleen worden genoemd na de Draad object is gemaakt en de thread is niet gestart. Een poging om te bellen setDaemon () terwijl een thread loopt, zal een IllegalThreadStateException:

@Test (verwacht = IllegalThreadStateException.class) openbare leegte whenSetDaemonWhileRunning_thenIllegalThreadStateException () {NewThread daemonThread = nieuwe NewThread (); daemonThread.start (); daemonThread.setDaemon (true); }

5. Controleren of een discussielijn een daemon-discussielijn is

Ten slotte, om te controleren of een thread een daemon-thread is, kunnen we eenvoudig de methode aanroepen isDaemon ():

@Test openbare leegte whenCallIsDaemon_thenCorrect () {NewThread daemonThread = nieuwe NewThread (); NewThread userThread = nieuwe NewThread (); daemonThread.setDaemon (true); daemonThread.start (); userThread.start (); assertTrue (daemonThread.isDaemon ()); assertFalse (userThread.isDaemon ()); }

6. Conclusie

In deze korte tutorial hebben we gezien wat daemon-threads zijn en waarvoor ze kunnen worden gebruikt in een paar praktische scenario's.

Zoals altijd is de volledige versie van de code beschikbaar op GitHub.