Heim > Java > javaLernprogramm > Beispielanalyse von Daemon-Threads und Nicht-Daemon-Threads in Java

Beispielanalyse von Daemon-Threads und Nicht-Daemon-Threads in Java

黄舟
Freigeben: 2017-10-14 09:37:11
Original
1249 Leute haben es durchsucht

In diesem Artikel werden hauptsächlich Daemon-Threads und Nicht-Daemon-Threads in Java vorgestellt. Der Herausgeber findet ihn recht gut, daher werde ich ihn jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Editor, um einen Blick darauf zu werfen

Kürzlich habe ich die Grundkenntnisse von Java erneut recherchiert und festgestellt, dass in der Vergangenheit zu viel Wissen ignoriert wurde. Beim Vergleich des Threading-Mechanismus von Java gibt es zwei Arten von Threads Java: Benutzer-Thread (Benutzer-Thread), Daemon-Thread (Daemon-Thread), (PS: Ich habe es vorher ignoriert).

Studenten, die Unix-Entwicklung studiert haben, aber Java nicht im Detail studiert haben, sind möglicherweise verwirrt. Es gibt keinen sogenannten Daemon-Thread im Betriebssystem, sondern nur Daemon-Prozesse, aber der Java-Sprachmechanismus ist auf der JVM aufgebaut Im Grunde bedeutet dies, dass die Java-Plattform die unterste Schicht des Betriebssystems abschirmt, sodass sie in ihrer eigenen virtuellen Plattform einen für sie selbst vorteilhaften Mechanismus konstruieren kann und der Designer der Sprache oder Plattform mehr oder weniger dafür verantwortlich ist Beeinflusst durch das Unix-Denken und den Daemon-Thread-Mechanismus, der für Plattformen wie JVM geeignet ist, entstanden Daemon-Threads.

Die Rolle des Daemon besteht darin, Dienste für die Ausführung anderer Threads bereitzustellen, beispielsweise GC-Threads. Tatsächlich gibt es im Wesentlichen keinen Unterschied zwischen Benutzer-Threads und Daemon-Thread-Daemon-Threads. Der einzige Unterschied liegt im Verlassen der virtuellen Maschine: Wenn alle Benutzer-Threads evakuiert werden, hat der Daemon-Thread keine Threads zu bedienen, also die virtuelle Maschine geht auch raus.

Der Daemon-Thread wird nicht innerhalb der virtuellen Maschine bereitgestellt. Methode: public final void setDaemon(boolean on);

1), thread.setDaemon(true) muss vor thread.start() gesetzt werden, andernfalls wird eine IllegalThreadStateException geworfen. Sie können einen laufenden regulären Thread nicht als Daemon-Thread festlegen. (Hinweis: Dies unterscheidet sich offensichtlich vom Daemon-Prozess. Nachdem der Daemon-Prozess erstellt wurde, kann der Prozess die Kontrolle über die ursprüngliche Sitzung loswerden + der Prozess wird die Kontrolle über die ursprüngliche Prozessgruppe los + der Prozess erhält Die Steuerung des ursprünglichen Steuerterminals wird aufgehoben. Der Sprachmechanismus der Maschine unterscheidet sich im Wesentlichen von der Sprache auf Systemebene.

2) Die im Daemon-Thread generierten neuen Threads sind auch Daemons. (Dies ist ein wesentlicher Unterschied: Der untergeordnete Prozess, der aus dem Daemon-Prozess fork() hervorgeht, ist kein Daemon-Prozess mehr. Obwohl er die prozessbezogenen Informationen des übergeordneten Prozesses kopiert, ist der übergeordnete Prozess des untergeordneten Prozesses kein Daemon-Prozess mehr init-Prozess. Der sogenannte Daemon-Prozess bedeutet im Wesentlichen „Der übergeordnete Prozess stirbt, init übernimmt ihn und dann sind die Dateien 0, 1, 2 alle /dev/null und das aktuelle Verzeichnis ist /“)

3) können nicht alle Anwendungen Daemon-Threads zugewiesen werden, um Dienste wie Lese- und Schreibvorgänge oder Berechnungslogik auszuführen. Weil die virtuelle Maschine möglicherweise beendet wurde, bevor der Daemon-Thread den Vorgang ausführen kann.

Beispiel:


//完成文件输出的守护线程任务

import java.io.*; 

 

class TestRunnable implements Runnable{ 

  public void run(){ 

        try{ 

         Thread.sleep(1000);//守护线程阻塞1秒后运行 

         File f=new File("daemon.txt"); 

         FileOutputStream os=new FileOutputStream(f,true); 

         os.write("daemon".getBytes()); 

      } 

        catch(IOException e1){ 

     e1.printStackTrace(); 

        } 

        catch(InterruptedException e2){ 

         e2.printStackTrace(); 

      } 

  } 

} 

public class TestDemo2{ 

  public static void main(String[] args) throws InterruptedException 

  { 

    Runnable tr=new TestRunnable(); 

    Thread thread=new Thread(tr); 

        thread.setDaemon(true); //设置守护线程 

    thread.start(); //开始执行分进程 

  } 

}
Nach dem Login kopieren
Ausführungsergebnis: In der Datei daemon.txt gibt es keine „daemon“-Zeichenfolge.

Aber wenn Sie thread.setDaemon(true); //Set daemon thread auskommentieren, kann die Datei daemon.txt in den Daemon-String geschrieben werden

Das Kriterium für die Beurteilung, ob ein Programm beendet wurde, ist, dass alle Vordergrundausführungsthreads unabhängig vom Status der Hintergrundthreads abgeschlossen sind. Daher müssen Sie bei der Verwendung von Hintergrundthreads auf dieses Problem achten.

Aber wo ist die eigentliche Anwendung des Daemon-Threads? Beispielsweise wird für ein Servlet in einem Webserver beim Start des Containers ein Service-Thread im Hintergrund initialisiert, d Ein Arbeitsthread aus dem Thread-Pool verarbeitet die Anforderung, um den Zweck der Parallelitätskontrolle zu erreichen.

Ein Bild aus dem Internet, um Ihr Verständnis zu erleichtern:

Das obige ist der detaillierte Inhalt vonBeispielanalyse von Daemon-Threads und Nicht-Daemon-Threads in Java. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage