Daemon tråde i Java

1. Oversigt

I denne korte artikel vil vi se på dæmontråde i Java og se, hvad de kan bruges til. Vi forklarer også forskellen mellem dæmontråde og brugertråde.

2. Forskel mellem daemon og brugertråde

Java tilbyder to typer tråde: brugertråde og dæmontråde.

Brugertråde er tråde med høj prioritet. JVM vil vente på, at enhver brugertråd afslutter sin opgave, inden den afsluttes.

På den anden side, daemon-tråde er tråde med lav prioritet, hvis eneste rolle er at levere tjenester til brugertråde.

Da dæmontråde er beregnet til at betjene brugertråde og kun er nødvendige, mens brugertråde kører, forhindrer de ikke, at JVM'en afsluttes, når alle brugertråde er færdige med deres udførelse.

Derfor vil uendelige sløjfer, som typisk findes i dæmontråde, ikke forårsage problemer, fordi enhver kode, inklusive langt om længe blokke, vil ikke blive udført, når alle brugertråde er færdige med deres udførelse. Af denne grund, daemon-tråde anbefales ikke til I / O-opgaver.

Der er dog undtagelser fra denne regel. Dårligt designet kode i dæmontråde kan forhindre JVM i at komme ud. For eksempel at ringe Thread.join () på en kørende dæmontråd kan blokere nedlukningen af ​​applikationen.

3. Anvendelse af Daemon-tråde

Daemon-tråde er nyttige til baggrundsunderstøttende opgaver såsom affaldsindsamling, frigivelse af hukommelse af ubrugte objekter og fjernelse af uønskede poster fra cachen. De fleste af JVM-tråde er dæmontråde.

4. Oprettelse af en dæmontråd

For at indstille en tråd til at være en dæmontråd er alt, hvad vi skal gøre, at ringe Thread.setDaemon (). I dette eksempel bruger vi Ny tråd klasse, der udvider Tråd klasse:

NewThread daemonThread = ny NewThread (); daemonThread.setDaemon (sand); daemonThread.start ();

Enhver tråd arver dæmonstatus for den tråd, der oprettede den. Da hovedtråden er en brugertråd, er enhver tråd, der oprettes inden for hovedmetoden, som standard en brugertråd.

Metoden setDaemon () kan kun kaldes efter Tråd objekt er oprettet, og tråden er ikke startet. Et forsøg på at ringe setDaemon () mens en tråd kører vil kaste en IllegalThreadStateException:

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

5. Kontrol af, om en tråd er en dæmontråd

Endelig kan vi bare kalde metoden for at kontrollere, om en tråd er en dæmontråd isDaemon ():

@Test offentlig ugyldig nårCallIsDaemon_thenCorrect () {NewThread daemonThread = ny NewThread (); NewThread userThread = new NewThread (); daemonThread.setDaemon (sand); daemonThread.start (); userThread.start (); assertTrue (daemonThread.isDaemon ()); assertFalse (userThread.isDaemon ()); }

6. Konklusion

I denne hurtige vejledning har vi set, hvad dæmontråde er, og hvad de kan bruges til i et par praktiske scenarier.

Som altid er den fulde version af koden tilgængelig på GitHub.