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