Maison > Java > javaDidacticiel > Explication détaillée des bases du multithreading Java

Explication détaillée des bases du multithreading Java

迷茫
Libérer: 2017-03-28 15:36:08
original
2246 Les gens l'ont consulté

1. Statut du fil

2. Création et utilisation de multi-threads

3. 🎜>

4. Collecte synchrone

Statut du fil

Les threads ont cinq états : nouveau, prêt, en cours d'exécution, bloqué ou terminé.

Nouveau : créez un nouveau fil de discussion et le fil entre dans le nouvel état ;

Prêt : après avoir appelé la méthode start() du fil de discussion pour démarrer le fil, il entre dans l'état prêt ; >

Exécuter : lorsque vous obtenez du temps CPU, le thread passe à l'état d'exécution à partir de l'état prêt. Si la tranche de temps expire ou si la méthode rendement() est appelée, le thread à l'état d'exécution peut entrer dans l'état prêt ;

Blocage : appelez la méthode join(), sleep() ou wait(), ou attendez la fin de l'E/S, le thread est dans un état bloqué

Complet : lorsque le thread se termine ; en exécutant la méthode run(), le thread se termine.

Création et utilisation de multi-threads

Diagramme de classes de Thread

1. Héritez de la classe Thread pour créer un nouveau fil

2. Implémentez l'interface Runnable

et réécrivez. méthode run()

PrintChar implémente l'interface Runnable et utilise Thread crée un thread. Puisque la classe Thread implémente l'interface Runnable, vous pouvez créer un objet de cette classe et appeler sa méthode start pour démarrer le thread

3. l'interface Executor Pour exécuter des tâches dans le pool de threads, l'interface ExecutorService est fournie pour gérer et contrôler les tâches.

Synchronisation des threads

Si une ressource partagée est accédée par plusieurs threads en même temps, elle peut être corrompue. Par exemple, si les champs de données sont modifiés dans des ordres différents, la valeur finale peut être incertaine. État de concurrence : si deux tâches ou plus accèdent à une ressource commune d'une manière qui provoque un conflit, cela s'appelle un état de concurrence. Pour éviter un état de concurrence, plusieurs threads doivent être évités. en même temps, entrez une partie spécifique du programme. Cette partie du programme est appelée section critique.

1. Utiliser la synchronisation des verrous

Java peut explicitement utiliser des verrous et des états pour synchroniser les threads. Un verrou est une instance de l'interface Lock, qui définit les méthodes de verrouillage et de libération des verrous.

RenntrantLock est une implémentation de Lock, utilisée pour créer des verrous mutuellement exclusifs. Des verrous peuvent être créés pour des politiques d’équité spécifiques. Une valeur de stratégie juste de 1 est vraie, garantissant que le thread avec le temps d'attente le plus long acquiert le verrou en premier. Si faux, il est donné à n'importe quel thread en attente.


2. Collaboration avec les threads

Les objets créés en appelant la méthode newCondition() de l'objet Lock peuvent être utilisés. Méthodes wait(), signal() et signalAll() pour établir une communication mutuelle entre les threads.

Lorsque le thread appelle la méthode wait(), le thread entre dans l'état d'attente, en attendant le signal de réveil.

3. La file d'attente de blocage

peut bloquer le thread actuel. Si un thread prend des éléments d'une file d'attente de blocage vide, le fil sera bloqué jusqu'à ce qu'il y ait des éléments dans la file d'attente bloquée. être automatiquement réveillé, ce qui offre une grande commodité.

Plusieurs files d'attente de blocage :

1 : ArrayBlockingQueue utilise un tableau pour implémenter une file d'attente de blocage, et une capacité ou une stratégie d'équité facultative doit être spécifiée pour construire

2 : LinkedBlockingQueue utilise une liste chaînée pour implémenter une file d'attente bloquante. Peut être créé de manière illimitée ou limitée.

3 : File d'attente prioritaire PriorityBlockQueue, trie les éléments en fonction de leur priorité.

Champ de données ArrayBlockingQueue




On peut voir que l'espace de stockage est un tableau et qu'un verrou est utilisé .

Mise en œuvre de deux méthodes importantes

Attendez lorsque la file d'attente est pleine et rejoignez la file d'attente lorsqu'elle n'est pas pleine. À ce moment, utilisez la synchronisation des verrous

file d'attente Attendez lorsqu'elle est vide et quittez la file d'attente lorsqu'elle n'est pas vide.

Applications bloquant les files d'attente

par As Comme le montre l'exemple, le producteur met les numéros dans la file d'attente, le consommateur prend les numéros de la file d'attente et attend lorsque la file d'attente est vide. La synchronisation a été implémentée dans la file d'attente sans utiliser de verrous ni de conditions.

3. Sémaphore

Le sémaphore fait référence à l'objet qui accède aux ressources communes. Avant d'accéder à une ressource, un thread doit obtenir l'autorisation du sémaphore. Après avoir accédé à la ressource, l'autorisation doit être restituée au sémaphore.

Le programme crée un sémaphore avec une autorisation. Lorsqu'un thread obtient une autorisation, les autres threads ne peuvent pas accéder à la ressource jusqu'à ce que le thread précédent libère l'autorisation.

Collections synchronisées

Les classes du framework Java Collections ne sont pas thread-safe, c'est-à-dire si elles sont accessibles par plusieurs threads en même temps ; en même temps et Mise à Jour, leur contenu peut être corrompu, vous pouvez protéger les données de la collection en verrouillant la collection ou en synchronisant la collection

Articles associés :

Implémentation Java de PUT, POST, demande de suppression

Introduction détaillée à la programmation Java Résumé des problèmes courants

Graphique de la communication à distance Java analyse de la technologie et des principes Introduction

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!

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
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
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal