Avec le nombre croissant de cœurs de CPU, il est inévitable d'utiliser une technologie multi-threading pour utiliser pleinement sa puissance de calcul. Par conséquent, la technologie multi-threading est une technologie que les développeurs de serveurs doivent maîtriser.
La création et la destruction des threads impliquent des appels système et consomment des ressources système, de sorte que la technologie de mise en commun des threads est introduite pour éviter la création et la destruction de threads fréquents.
Dans Java, il existe une classe d'outils exécuteurs qui peut créer un pool de threads pour nous. L'essence consiste à nouveau un objet ThreadPoolExecutor. Les pools de threads sont presque également un incontournable dans les questions d'entrevue. Cette section combine le code source pour parler du principe de travail de ThreadExecutor
1. Création de piscine de fil
Regardons d'abord les paramètres du constructeur les plus complets de ThreadPoolExecutor:
① CorePoolSize: le nombre de threads de base dans le pool de threads. Pour le dire franchement, même s'il n'y a pas de tâches dans la piscine de fil, il y aura des fils de CorePoolSize en attente de tâches.
②MaxiMumpoolSize: le nombre maximum de threads. Peu importe le nombre de tâches que vous soumettez, le nombre maximum de threads de travail dans le pool de threads est maximumpoolSize.
③ Keepalivetime: le temps de survie du fil. Lorsque le nombre de threads dans le pool de threads est supérieur à CorePoolSize, s'il n'y a pas de tâche à exécuter après avoir attendu KeepaliveTime, le thread sort.
⑤Unit: Ceci est utilisé pour spécifier l'unité de keepalivetime, comme les secondes: timeunit.seconds.
⑥ WorkQueue: une file d'attente de blocage et les tâches soumises seront placées dans cette file d'attente.
⑦ ThreadFactory: une usine de threads, utilisée pour créer des threads, principalement pour nommer le thread. Le nom de thread d'usine par défaut est Pool-1-thread-3.
⑧Handler: rejeter la politique, appelée lorsque les fils du pool de threads sont épuisés et que la file d'attente est pleine.
Ce qui précède sont les paramètres utilisés lors de la création d'un pool de threads. Les enquêteurs posent souvent cette question lors des entretiens.
2. Processus d'exécution du pool de threads
Voici un diagramme pour illustrer le processus d'exécution du pool de threads
Lorsqu'une tâche est soumise au pool de threads, il déterminera d'abord si le nombre actuel de threads est inférieur à CorePoolSize. S'il est inférieur, un thread sera créé pour exécuter la tâche soumise. Sinon, la tâche sera mise dans la file d'attente WorkQueue. Si le Workqueue est plein, il déterminera si le nombre actuel de threads est inférieur à MaximumpoolSize. S'il est inférieur, un thread sera créé pour exécuter la tâche. Sinon, un gestionnaire sera appelé pour indiquer que le pool de thread refuse de recevoir la tâche.
Ici, prenez le code source de JDK1.8.0_111 comme exemple pour voir l'implémentation spécifique.
1. Premièrement, regardez la méthode de l'exécuteur exécuteur du pool de threads
①: Déterminez si le nombre actuel de threads actifs est inférieur à CorePoolSize. S'il est inférieur, appelez AddWorker pour créer un thread pour exécuter des tâches
②: S'il n'est pas moins que CorePoolSize, ajoutez la tâche à la file d'attente WorkQueue.
③: Si le workqueue est mis dans le workqueue, le thread de création exécutera la tâche. Si le thread de création échoue à l'heure actuelle (le nombre actuel de threads n'est pas inférieur à MaximumpoolSize), Reject sera appelé (gestionnaire d'appel interne) et refuserait d'accepter la tâche.
2. Examinons l'implémentation de la méthode AddWorker
Ce morceau de code est lors de la création d'un thread non core, c'est-à-dire que Core est égal à FAUX. Déterminez si le nombre actuel de threads est supérieur ou égal à MaximumpoolSize. S'il est supérieur ou égal à Faux, c'est-à-dire que la création de fil a échoué en ③ mentionné ci-dessus.
La seconde moitié de la méthode AddWorker:
① Créez un objet de travailleur et instanciez un objet de thread.
Affectez ce fil
3. Allez chez le travailleur pour voir sa mise en œuvre
Vous pouvez voir que ThreadFactory est appelé lors de la création d'un travailleur pour créer un thread. Le démarrage d'un thread dans ce qui précède déclenchera la méthode d'exécution du travailleur à être appelé par le fil.
4. Ensuite, jetons un coup d'œil à la logique de la méthode Runworker.
Le thread appelle Runwoker, et appellera la méthode GetTask pendant que Loop lira la tâche de WorkerQueue, puis exécutera la tâche. Tant que la méthode GetTask ne renvoie pas NULL, ce fil ne sortira pas.
5. Enfin, jetons un coup d'œil à l'implémentation de la méthode GetTask
① Ignorez AutorCoreThreadTimeout, la valeur par défaut de cette variable est fausse. WC> CorePoolSize détermine si le nombre actuel de threads est supérieur à CorePoolSize.
② Si le nombre actuel de threads est supérieur à CorePoolSize, la méthode du scrutin de WorkQueue sera appelée pour obtenir la tâche et le délai d'attente est KeepaliveTime. Si le temps de KeepaliveTime dépasse la limite de temps, le sondage renvoie NULL, et que le temps mentionné ci-dessus sortira en séquence et le thread sera exécuté.
Si le nombre actuel de threads est inférieur à CorePoolSize, la méthode de prise de travail de travail sera appelée pour bloquer pour le moment.
L'article ci-dessus est basé sur le principe de travail et l'interprétation du code source du pool de threads. Cet article est tout le contenu partagé par l'éditeur. J'espère que cela pourra vous donner une référence et j'espère que vous pourrez soutenir Wulin.com plus.