Maison >Java >javaDidacticiel >Exemple d'analyse des threads démons et des threads non-démons en Java

Exemple d'analyse des threads démons et des threads non-démons en Java

黄舟
黄舟original
2017-10-14 09:37:111247parcourir

Cet article présente principalement le thread démon et le thread non-démon en Java. L'éditeur pense que c'est plutôt bon, je vais donc le partager avec vous maintenant et le donner comme référence. Suivons l'éditeur pour y jeter un œil

Récemment, j'ai refait des recherches sur les connaissances de base de Java et j'ai découvert que trop de connaissances avaient été ignorées dans le passé. En comparant le mécanisme de thread de Java, il existe deux types de threads. Java : User Thread (thread utilisateur), Daemon Thread (thread démon), (PS : je l'ai ignoré auparavant).

Les étudiants qui ont étudié le développement Unix mais n'ont pas étudié Java en détail peuvent être confus. Il n'y a pas de soi-disant thread démon dans le système d'exploitation, seulement un processus démon, mais le mécanisme du langage Java est construit sur la JVM. Fondamentalement, cela signifie que la plate-forme Java protège la couche inférieure du système d'exploitation, afin qu'elle puisse construire un mécanisme qui lui est bénéfique dans sa propre plate-forme virtuelle, et que le concepteur du langage ou de la plate-forme est plus ou moins responsable de cela. Influencé par la pensée Unix et que le mécanisme de thread démon est adapté aux plates-formes telles que JVM, les threads démon ont vu le jour.

Le rôle de Daemon est de fournir des services pour l'exécution d'autres threads, tels que les threads GC. En fait, il n'y a essentiellement aucune différence entre les threads User Thread et les threads démon Daemon Thread. La seule différence réside dans le départ de la machine virtuelle : si tous les threads utilisateur évacuent, alors Daemon Thread n'aura aucun thread à servir, donc la machine virtuelle. sort également.

Le thread démon n'est pas fourni dans la machine virtuelle. Les utilisateurs peuvent également définir le thread démon par eux-mêmes. Méthode : public final void setDaemon(boolean on);

1 ), thread.setDaemon(true) doit être défini avant thread.start(), sinon une IllegalThreadStateException sera levée. Vous ne pouvez pas définir un thread normal en cours d’exécution comme thread démon. (Remarque : ce point est évidemment différent du processus démon. Une fois le processus démon créé, il permet au processus de se débarrasser du contrôle de la session d'origine + le processus se débarrasse du contrôle du groupe de processus d'origine + le processus se débarrasse du contrôle du terminal de contrôle d'origine ; il s'appuie donc sur le virtuel. Le mécanisme de langage de la machine est essentiellement différent du langage au niveau du système)

2). aussi celui de Daemon. (Il s'agit d'une différence essentielle : le processus enfant qui sort du processus démon fork() n'est plus un processus démon. Bien qu'il copie les informations liées au processus du processus parent, le processus parent du processus enfant n'est pas le processus démon. processus init. , le soi-disant processus démon signifie essentiellement "le processus parent meurt, init l'adopte, puis les fichiers 0, 1, 2 sont tous /dev/null, et le répertoire actuel est /")

3), toutes les applications ne peuvent pas être affectées à des threads démon pour exécuter des services, tels que des opérations de lecture et d'écriture ou une logique de calcul. Parce que la machine virtuelle s'est peut-être fermée avant que Daemon Thread puisse effectuer l'opération.

Exemple :


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

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(); //开始执行分进程 

  } 

}
Résultat de l'exécution : Il n'y a pas de chaîne "démon" dans le fichier daemon.txt.

Mais si vous commentez thread.setDaemon(true); //Set démon thread, le fichier daemon.txt peut être écrit dans la chaîne du démon

Le critère permettant à JRE de juger si un programme est terminé est que tous les threads d'exécution de premier plan ont fini de s'exécuter, quel que soit l'état des threads d'arrière-plan. Par conséquent, vous devez faire attention à ce problème lorsque vous utilisez des threads d'arrière-plan.

Mais où est l'application réelle du démon Thread ? Par exemple, pour un Servlet dans un serveur web, lorsque le conteneur démarre, un thread de service est initialisé en arrière-plan, c'est-à-dire un thread de planification, qui est responsable du traitement des requêtes http. Ensuite, pour chaque requête, le thread de planification est supprimé. un thread de travail du pool de threads pour traiter la demande, afin d'atteindre l'objectif de contrôle de concurrence.

Une photo prise sur Internet pour faciliter votre compréhension :

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn