Ce que cet article vous apporte, c'est comment implémenter les threads en Java ? La méthode d'implémentation des threads Java (images et textes) a une certaine valeur de référence. Les amis dans le besoin peuvent s'y référer, j'espère qu'elle vous sera utile.
Processus et threads
Dans les systèmes d'exploitation traditionnels, le concept de base est « processus », et un processus est une abstraction d'un programme en cours d'exécution.
L'existence de processus rend le « parallélisme » possible. Dans un système d'exploitation, plusieurs processus sont autorisés à s'exécuter, et ces processus « semblent » s'exécuter en même temps.
Si notre ordinateur exécute plusieurs processus tels qu'un navigateur Web, un client de messagerie, un logiciel de messagerie instantanée tel que QQ WeChat, etc., nous avons l'impression que ces processus s'exécutent tous en même temps. Supposons que cet ordinateur en soit équipé de plusieurs. CPU ou CPU multicœur, alors ce phénomène de plusieurs processus en parallèle n'est peut-être pas du tout surprenant. Il est tout à fait possible d'attribuer un CPU à chaque processus, réalisant ainsi un parallélisme multi-processus.
Cependant, en fait, lorsque l'ordinateur ne dispose que d'un seul processeur, cela peut aussi donner aux humains l'impression que plusieurs processus s'exécutent en même temps. Mais les sentiments humains sont souvent vagues et imprécis. Le fait est que, comme la vitesse de calcul du CPU est très rapide, il peut basculer rapidement entre les processus. À un certain moment, le CPU ne peut exécuter qu'un seul processus, mais en une seconde, il peut basculer rapidement entre les processus, permettant ainsi aux utilisateurs de le faire. Crée l'illusion que plusieurs processus s'exécutent en même temps.
Dans le système d'exploitation, pourquoi la notion de thread est-elle dérivée du processus ?
Étant donné que pour certains processus, plusieurs activités se produiront à l'intérieur, certaines activités peuvent se bloquer à un certain moment, et certaines activités ne le seront pas, si ces activités sont séparées par des threads. Si vous les activez fonctionner en parallèle, il sera plus facile de concevoir le programme.
Les threads sont plus légers que la création de processus et consomment moins de performances
Si un processus nécessite à la fois des calculs CPU et un traitement d'E/S, avoir plusieurs les threads permettent à ces activités de se chevaucher, accélérant ainsi l'exécution de l'ensemble du processus.
Chaque processus dispose d'un espace d'adressage mémoire indépendant dans le système d'exploitation. Tous les threads créés par le processus partagent cette mémoire. Un système d'exploitation prenant en charge le multithread permettra aux threads de fonctionner comme des threads. la plus petite unité de planification du processeur. Les tranches de temps CPU sont réparties entre différents threads.
Fondamentalement, les systèmes d'exploitation traditionnels prennent en charge les threads et fournissent également des implémentations de threads. Afin de faire face aux différences entre les différents matériels et systèmes d'exploitation, le langage Java fournit une abstraction unifiée des opérations de thread. En Java, nous utilisons la classe Thread pour représenter un thread.
L'implémentation spécifique de Thread peut avoir différentes méthodes d'implémentation :
Les threads du noyau sont des threads pris en charge par le noyau du système d'exploitation. Il existe une table de threads dans le noyau. pour Enregistrez tous les threads du système. Lors de la création ou de la destruction d'un thread, des appels système sont requis, puis la table des threads est mise à jour dans le noyau. Le blocage des threads du noyau et d'autres opérations impliquent tous des appels système. Les appels système sont relativement coûteux et impliquent un va-et-vient entre le mode utilisateur et le mode noyau. De plus, il existe un planificateur de threads à l'intérieur du noyau qui détermine à quel thread la tranche de temps CPU doit être allouée.
Les programmes n'exploitent généralement pas directement le thread du noyau, mais utilisent une interface de haut niveau du thread du noyau, un processus léger. La relation entre les processus légers et les threads du noyau est de 1:1. Chaque processus léger est pris en charge par un thread du noyau.
Dans la figure ci-dessus, LWP fait référence à un processus léger, c'est-à-dire un processus léger, KLT fait référence à un thread au niveau du noyau, c'est-à-dire un noyau ; fil de discussion.
Les threads utilisateur sont des bibliothèques de threads implémentées par le programme ou le langage de programmation lui-même, et le noyau du système ne peut pas détecter l'existence de ces threads. L'établissement, la synchronisation, la destruction et la planification des threads utilisateur sont tous effectués en mode utilisateur sans l'aide du noyau et sans appels système. L'avantage est que le fonctionnement des threads est très efficace. Dans ce cas, le rapport processus/threads utilisateur est de 1:N.
Les threads en mode utilisateur rencontreront des difficultés lorsqu'ils seront confrontés à la façon de bloquer les threads. Le blocage d'un thread en mode utilisateur bloquera également l'ensemble du processus multithread. perd son sens. En raison du manque de prise en charge du noyau, de nombreuses tâches nécessitant l'utilisation du noyau, telles que le blocage et la réactivation des threads, le mappage des threads dans un environnement multi-CPU, etc., nécessitent la mise en œuvre de programmes utilisateur, ce qui est extrêmement difficile à mettre en œuvre. .
Dans cette implémentation hybride, il existe à la fois des threads utilisateur et des threads noyau. Les opérations de création et de changement de threads en mode utilisateur sont toujours très efficaces, et les threads implémentés en mode utilisateur facilitent l'augmentation de la taille des threads. Les fonctions qui nécessitent la prise en charge du noyau du système d'exploitation sont implémentées via les threads du noyau, telles que le mappage vers différents processeurs, le blocage et le réveil des threads de traitement, ainsi que la planification des threads du noyau. Cette implémentation utilisera toujours le processus léger LWP, qui constitue le pont entre les threads utilisateur et les threads du noyau.
Avant JDK1.2, les threads Java étaient implémentés à l'aide de threads utilisateur. Dans JDK1. Cela signifie que Java a été implémenté à l'aide du modèle de thread pris en charge nativement par le système d'exploitation. L'implémentation du modèle de thread Java dépend principalement du système d'exploitation. Pour Oracle JDK, le modèle de thread sous Windows et Linux est implémenté de manière individuelle, c'est-à-dire qu'un thread Java est mappé à un processus léger (thread du noyau). Sur la plateforme Solaris, Java prend en charge les modèles de thread 1:1 et N:M.
Le statut des threads en Java est le suivant : Nouveau, Exécutable, En attente, TimedWaiting, Bloqué, Terminé.
NOUVEAU : le fil de discussion est initialement créé, mais ne s'exécute pas
RUNNABLE : Thread en cours d'exécution, mais ne consommant pas nécessairement de CPU
BLOCKED : le thread attend qu'un autre thread libère le verrou
WAITING : le thread exécuté wait, join , méthode LockSupport.park()
TIMED_WAITING : le fil appelle sleep, wait, join, LockSupport.parkNanos() et d'autres méthodes différentes de l'état WAITING. avoir des paramètres de temps de représentation.
Une différence importante entre Bloqué et En attente est qu'un thread à l'état Bloqué attend d'acquérir un verrou exclusif. Par exemple, un thread attend d'entrer dans une section critique entourée du. mot-clé synchronisé , il passe à l'état Bloqué. L'état d'attente attend d'être réveillé ou attend pendant un certain temps.
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!