Pools de Threads en Java

Ordinaryblog 2022-01-15 02:50:29 阅读数:23

pools threads en java

Pourquoi utiliser un pool de threads?

  • Créer des fils à plusieurs reprises coûte cher
  • Trop de fils peuvent prendre trop de mémoire

Avantages de l'utilisation de pools de Threads:

  • Réduire la consommation de ressources(Réutiliser les fils créés)
  • Augmenter la vitesse de réponse
  • Contrôle centralisé

Création d'un pool de Threads:

new ThreadPoolExecutor(corePoolSize,maximumPoolSize,keepAliveTime,workQueue,threadFactory,Handler);

Signification du paramètre:

  • corePoolSize Nombre de fils de base:Si le thread en cours d'exécution est inférieur àcorePoolSizeHeure,Créer un nouveau thread pour exécuter la tâche
  • Si le thread en cours d'exécution est égal ou supérieur àcorePoolSize Mettez la tâche en file d'attente
  • Si la file d'attente est pleine,Créer un nouveau thread,Le nombre total de Threads ne peut pas dépasser maximumPoolSize
  • Si la file d'attente est pleine, Et le nombre de fils est supérieur ou égal à maximumPoolSize Rejeter la tâche
  • keepAliveTime Temps mort: Si le nombre de fils est supérieur à corePoolSize, Donc si vous avez des fils supplémentaires Temps librePlus quekeepAliveTime , Et ils seront arrêtés

Réglage ingénieux des paramètres

  • Via les paramètrescorePoolSizeAvecmaximumPoolSizeMême chose., Un pool de Threads de taille fixe peut être défini
  • Via les paramètresmaximumPoolSize Pour une valeur élevée ,Par exempleIngteger.MAX _VALUE, En théorie, un pool de Threads peut accueillir n'importe quel nombre de tâches simultanées
  • Créer plus que lorsque la file d'attente est pleine corePoolSizeLes fils de, Donc si vous utilisez une file d'attente illimitée (Par exempleLinkedBlockingQueue), Alors le nombre de fils ne dépassera pas corePoolSize

File d'attente de travail

  • ArrayBlockingQueue:Une file d'attente de blocage limitée basée sur la structure du tableau, Cette file d'attente Trie les éléments selon le principe du premier entré premier sorti
  • LinkedBlockingQueue:Une file d'attente bloquée basée sur une structure de liste liée, Cette file d'attente Trie les éléments selon le principe du premier entré premier sorti .Débit supérieur àArrayBlockingQueue
  • SynchronusQueue:Une file d'attente bloquée qui ne stocke pas les éléments.Débit supérieur àLinkedBlockingQueue
  • PriorityBlockingQueue:Une file d'attente infiniment bloquée avec priorité

ExecutorCadre

ExecutorsPeut être créé3 Types de pools de Threads

  • FixedThreadPool:Pour répondre aux besoins de la gestion des ressources, Et les scénarios d'application qui ont besoin de limiter le nombre de Threads . La file d'attente interne est LinkedBlockingQueue,Capacité:Integer.MAX_VALUE. Alors que les demandes augmentent , Et quand ça ne peut pas être fait à temps , C'est - à - dire qu'au moment de la demande d'accumulation , Il est facile de prendre beaucoup de mémoire ,Peut causerOOM
  • SingleThreadExecutor: La capacité fixe est de 1Pool de Threads pour. Pour assurer l'exécution séquentielle des tâches individuelles , Et à tout moment , Il n'y aura pas de multithreads actifs . La file d'attente interne est également LinkedBlockingQueue, Les inconvénients sont donc les mêmes que ci - dessus
  • CachedThreadPool: .Applet pour effectuer de nombreuses tâches asynchrones à court terme ,Ou un serveur moins chargé.Le nombre maximum de fils estInteger.MAX_VALUE, Cela peut entraîner la création d'un très grand nombre de Threads
  • ScheduledThreadPool Pool de Threads supportant l'exécution périodique des tâches

Le nombre de Threads dans le pool de Threads est plus approprié à quel point?

  • CPUDense(Cryptage、CalculhashAttendez.): Le nombre optimal de fils est CPUNombre de noyaux1-2Environ deux fois
  • Ça prend du tempsIOType(Lire et écrire la base de données、Documentation、Lecture et écriture en ligne, etc): Le nombre optimal de fils est généralement supérieur à CPULes noyaux sont multiples,ParJVMLe moniteur de thread affiche une charge de travail basée sur, Assurez - vous que les fils sont libres de se connecter .
  • Nombre de fils=CPUNombre de noyaux*(1+Temps d'attente moyen/Durée moyenne du travail)

État du pool de Threads

  • RUNNING:Accepter de nouvelles tâches et traiter les tâches en file d'attente
  • SHUTDOWN:Ne pas accepter de nouvelles tâches,Mais gérer les files d'attente
  • STOP:Ne pas accepter de nouvelles tâches,Ni traiter les tâches en file d'attente, Et interrompre la tâche en cours
  • TIDYING:Toutes les tâches Tout est terminé., Le thread se convertit en TIDYINGStatut,Et ça marcheraterminate() Méthode du crochet
  • TERMINATED:terminate()Exécution terminée

Fonctionnement du pool de threads

execte:Soumettre une tâche
shutdown Arrêter le fil
IsShutdown Vérifier si shutdownMéthodes
IsTerminated Vérifier si le thread s'est complètement arrêté
AwatitTermination: Détecter si le thread se termine complètement pendant un certain temps
ShutdownNow: Fermez tous les fils ( Exécuter pour le thread en cours d'exécution interruptNotification, Et stocke les Threads de la file d'attente qui n'ont pas terminé l'exécution dans le retour ListDans le tableau)

Refuser la tâche

Refuser le moment

  • QuandExecutorÀ la fermeture, Soumettre une nouvelle tâche sera refusé
  • QuandExecutor Lorsque la capacité du fil et la file d'attente de travail sont saturées

Politique de rejet

  • AbortPolicy Rejeter et renvoyer un message d'erreur
  • DiscardPolicy Refus de vol Ne pas renvoyer la lettre d'erreur
  • DiscardOldestPolicy Refuser la plus ancienne des files d'attente
  • CallerRunsPolicy Jetez la tâche au thread principal pour exécution

Composants du pool de Threads

  • Thread Pool Manager
  • File d'attente de travail
  • File d'attente des tâches
  • Interface des tâches

Attention à l'utilisation du pool de Threads

  • Évitez l'accumulation de tâches
  • Évitez une augmentation excessive du nombre de fils
  • Dépannage des fuites de fil
版权声明:本文为[Ordinaryblog]所创,转载请带上原文链接,感谢。 https://javamana.com/2022/01/202201080600349798.html