Daemon-tråder i Java

1. Oversikt

I denne korte artikkelen tar vi en titt på demon-tråder i Java og ser hva de kan brukes til. Vi forklarer også forskjellen mellom daemon-tråder og brukertråder.

2. Forskjellen mellom Daemon og brukertråder

Java tilbyr to typer tråder: brukertråder og daemon-tråder.

Brukertråder er tråder med høy prioritet. JVM vil vente på at en brukertråd skal fullføre oppgaven før den avsluttes.

På den andre siden, daemon-tråder er tråder med lav prioritet hvis eneste rolle er å tilby tjenester til brukertråder.

Siden daemon-tråder er ment å tjene brukertråder og bare trengs mens brukertråder kjører, vil de ikke forhindre at JVM avsluttes når alle brukertråder er ferdig.

Derfor vil uendelige sløyfer, som vanligvis finnes i daemon-tråder, ikke forårsake problemer, fordi en hvilken som helst kode, inkludert endelig blokker, vil ikke bli utført når alle brukertrådene er ferdige. Av denne grunn, daemon-tråder anbefales ikke for I / O-oppgaver.

Imidlertid er det unntak fra denne regelen. Dårlig utformet kode i daemon-tråder kan forhindre at JVM går ut. For eksempel å ringe Thread.join () på en løpende demonstråd kan blokkere nedleggelsen av applikasjonen.

3. Bruk av Daemon-tråder

Daemon-tråder er nyttige for bakgrunnsstøttende oppgaver som søppelinnsamling, frigjør minne av ubrukte objekter og fjerner uønskede oppføringer fra hurtigbufferen. De fleste av JVM-trådene er daemon-tråder.

4. Opprette en Daemon-tråd

For å sette en tråd til å være en demonstråd, er alt vi trenger å ringe Thread.setDaemon (). I dette eksemplet bruker vi Ny tråd klasse som utvider Tråd klasse:

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

Enhver tråd arver daemon-statusen til tråden som opprettet den. Siden hovedtråden er en brukertråd, er enhver tråd som opprettes i hovedmetoden som standard en brukertråd.

Metoden setDaemon () kan bare ringes etter Tråd objektet er opprettet og tråden er ikke startet. Et forsøk på å ringe setDaemon () mens en tråd går vil kaste en IllegalThreadStateException:

@Test (forventet = IllegalThreadStateException.class) offentlig ugyldig nårSetDaemonWhileRunning_thenIllegalThreadStateException () {NewThread daemonThread = new NewThread (); daemonThread.start (); daemonThread.setDaemon (true); }

5. Kontrollere om en tråd er en daemon-tråd

Til slutt, for å sjekke om en tråd er en demonstråd, kan vi bare kalle metoden isDaemon ():

@Test offentlig ugyldig når CallIsDaemon_thenCorrect () {NewThread daemonThread = new NewThread (); NewThread userThread = new NewThread (); daemonThread.setDaemon (true); daemonThread.start (); userThread.start (); assertTrue (daemonThread.isDaemon ()); assertFalse (userThread.isDaemon ()); }

6. Konklusjon

I denne raske opplæringen har vi sett hva daemon-tråder er og hva de kan brukes til i noen få praktiske scenarier.

Som alltid er den fullstendige versjonen av koden tilgjengelig på GitHub.