Comment implémenter une file d'attente de blocage en Java
L'utilisation de l'interface BlockingQueue intégrée dans Java est le moyen recommandé d'implémenter les files d'attente de blocage. Par exemple, ArrayBlockingQueue fournit une file d'attente en filetage bornée basée sur des tableaux; 2. Vous pouvez créer une file d'attente de blocage personnalisée de zéro à Synchronisé, attendre () et notifyall () pour vous assurer que la méthode de put bloque lorsque la file d'attente est pleine, la méthode Take bloque lorsque la file d'attente est vide et utilise une boucle while pour empêcher le faux réveil; 3. L'implémentation intégrée est une file d'attente, d'excellentes performances et prend en charge les opérations de délai d'attente. Il doit être prioritaire à utiliser dans l'environnement de production, et les implémentations personnalisées sont principalement utilisées pour l'apprentissage ou les besoins spéciaux.
La mise en œuvre d'une file d'attente de blocage dans Java implique la création d'une file d'attente en filetage qui bloque lorsqu'il essaie de se déshabiller d'une file d'attente vide ou d'une file d'attente dans une file d'attente complète (si bornée). Vous pouvez en créer un à partir de zéro en utilisant une synchronisation de bas niveau ou tirer parti des utilitaires de concurrence existants. Voici comment faire les deux.
1. Utilisation d'interface BlockingQueue intégrée (recommandée)
Java fournit une interface java.util.concurrent.BlockingQueue
avec plusieurs implémentations prêtes à l'emploi. C'est le moyen standard et le plus sûr.
Implémentations courantes:
-
ArrayBlockingQueue
- Fitre bornée basée sur un tableau. -
LinkedBlockingQueue
- File d'attente limité en éventuellement en fonction des nœuds liés. -
PriorityBlockingQueue
- file d'attente prioritaire illimitée. -
SynchronousQueue
- Transfère les éléments directement entre les fils.
Exemple: Utilisation de ArrayBlockingQueue
Importer java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.blockingQueue; classe publique ProduCerConsumerexample { private static final int queue_capacity = 5; BlockingQueue statique privée <Integer> queue = new ArrayBlockingQueue <> (queue_capacity); public static void main (String [] args) { Thread producteur = nouveau thread (() -> { essayer { pour (int i = 0; i <10; i) { queue.put (i); // blocs si la file d'attente est pleine System.out.println ("produit:" i); Thread.Sleep (100); } } catch (InterruptedException e) { Thread.currentThread (). Interrupt (); } }); Thread Consumer = nouveau thread (() -> { essayer { while (true) { Integer Value = Queue.Take (); // bloque si la file d'attente est vide System.out.println ("Consommé:" Valeur); if (valeur == 9) Break; // s'arrête après avoir consommé tout Thread.Sleep (200); } } catch (InterruptedException e) { Thread.currentThread (). Interrupt (); } }); producteur.start (); Consumer.start (); } }
Cette approche est en sécurité, efficace et les gèrent automatiquement.
2. Construire une file d'attente de blocage personnalisée à partir de zéro
Si vous souhaitez comprendre les internes ou avoir besoin d'un comportement personnalisé, vous pouvez implémenter un en utilisant synchronized
, wait()
et notifyAll()
.
Points clés:
- Utilisez des méthodes ou des blocs
synchronized
pour l'exclusion mutuelle. - Utilisez
wait()
pour bloquer les threads lorsque la file d'attente est vide (pour prendre) ou complète (pour put). - Utilisez
notifyAll()
pour réveiller les fils d'attente lorsque l'état change.
Exemple: file d'attente de blocage délimitée sur mesure
import java.util.linkedlist; Importer Java.util.Queue; classe publique CustomBlockingQueue <T> { file d'attente finale privée <T> queue = new LinkedList <> (); Capacité INT finale privée; public CustomBlockingQueue (INT CAPACITY) { this.capacity = capacité; } Public synchronisé vide put (ttel) lance InterruptedException { while (queue.size () == capacité) { attendez(); // attendez si vous } queue.add (article); notifyall (); // informer les consommateurs d'attente } Le public synchronisé t à prendre () lance InterruptedException { while (queue.isempty ()) { attendez(); // attendez si vide } T item = queue.poll (); notifyall (); // informer les producteurs d'attente return item; } public synchronisé int size () { return queue.size (); } }
Exemple d'utilisation
classe publique CustomBlockingQueueDemo { public static void main (String [] args) { CustomBlockingQueue <Integer> queue = new CustomBlockingQueue <> (3); Thread producteur = nouveau thread (() -> { essayer { pour (int i = 0; i <5; i) { queue.put (i); System.out.println ("produit:" i); Thread.Sleep (100); } } catch (InterruptedException e) { Thread.currentThread (). Interrupt (); } }); Thread Consumer = nouveau thread (() -> { essayer { pour (int i = 0; i <5; i) { Integer Value = Queue.Take (); System.out.println ("Consommé:" Valeur); Thread.Sleep (200); } } catch (InterruptedException e) { Thread.currentThread (). Interrupt (); } }); producteur.start (); Consumer.start (); } }
Notes de conception clés
- Utilisez
while
les boucles avecwait()
: Vérifiez toujours les conditions dans une boucle pour éviter les réveils parasites. - Appel
notifyAll()
au lieu denotify()
: s'assure que tous les threads d'attente pertinents ont la possibilité de procéder. - Sécurité du thread : Tout l'accès à l'état partagé doit être synchronisé.
- Boundé vs illimité : décidez si votre file d'attente doit avoir une capacité fixe.
L'utilisation des implémentations BlockingQueue
de java.util.concurrent
est préférée dans la production. Rouler le vôtre est utile pour l'apprentissage ou des cas d'utilisation très spécifiques. Les versions intégrées sont bien testées, performantes et les délais d'attente de soutien ( offer(e, timeout)
, poll(timeout)
), qui sont plus difficiles à se répercuter manuellement.
Fondamentalement, à moins que vous n'ayez une raison spéciale, optez pour ArrayBlockingQueue
ou LinkedBlockingQueue
.
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!

Outils d'IA chauds

Undress AI Tool
Images de déshabillage gratuites

Undresser.AI Undress
Application basée sur l'IA pour créer des photos de nu réalistes

AI Clothes Remover
Outil d'IA en ligne pour supprimer les vêtements des photos.

Stock Market GPT
Recherche d'investissement basée sur l'IA pour des décisions plus intelligentes

Article chaud

Outils chauds

Bloc-notes++7.3.1
Éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise
Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1
Puissant environnement de développement intégré PHP

Dreamweaver CS6
Outils de développement Web visuel

SublimeText3 version Mac
Logiciel d'édition de code au niveau de Dieu (SublimeText3)

Utilisez le paramètre -cp pour ajouter le pot au ClassPath, afin que le JVM puisse charger ses classes et ressources internes, telles que Java-Cplibrary.jarcom.example.main, qui prend en charge plusieurs pots séparés par semi-colons ou couleurs, et peut également être configuré via des variables d'environnement de ClassPath Variables ou Manifest.mf.

UseFile.CreateEnewFile () toCreateaFileOnlyiFitDoOesn’texist, EvitingoverWriting; 2.Preferfiles.CreateFile () FromNio.2Formodern, SafeFilecreationThatFailSiftheFileExists; 3.UseFileWriterorPrintwriterWistereAdMedimMedimate

Les systèmes en temps réel nécessitent des réponses déterministes, car l'exactitude dépend du délai de livraison des résultats; Les systèmes durs en temps réel nécessitent des délais stricts, manqués entraînera des catastrophes, tandis que le temps réel doux permet des retards occasionnels; Des facteurs non déterministes tels que la planification, les interruptions, les caches, la gestion de la mémoire, etc. affectent le calendrier; Le plan de construction comprend la sélection des RTO, l'analyse WCET, la gestion des ressources, l'optimisation matérielle et les tests rigoureux.

Tout d'abord, activez la fonction de mise à l'échelle intégrée du navigateur UC, accédez aux paramètres → Paramètres parcourir → Police et composition ou mise à l'échelle de la page, et sélectionnez un rapport préréglé ou un pourcentage personnalisé; Deuxièmement, vous pouvez forcer la taille de l'affichage de la page en ouvrant ou en pinçant des gestes avec deux doigts; Pour les pages Web qui restreignent la mise à l'échelle, vous pouvez demander la version de bureau du site Web pour déverrouiller les restrictions; Les utilisateurs avancés peuvent également modifier les attributs de la fenêtre en exécutant le code JavaScript dans la barre d'adresse pour obtenir un effet de mise à l'échelle forcé plus flexible.

La réponse consiste à utiliser Thread.currentThread (). GetStackTrace () pour obtenir le nom de la méthode d'appel, et obtenir le nom Somemethod de l'appel un autre Method via l'index 2. Étant donné que l'index 0 est GetStackTrace, 1 est la méthode actuelle, et 2 est l'appelant, l'exemple de production est "appelé paryMethod: Somemethod", qui peut également être mis en œuvre par le jetable, mais que l'attention doit être accordée à la performance, à l'obfrégation.

Edge occupe un CPU élevé en raison de la consommation élevée de ressources basée sur le noyau de chrome, ainsi que des facteurs tels que les pages multi-tabs, l'exécution du plug-in, les scripts de site Web et les mécanismes de rendu; Les solutions comprennent: 1. Fermer des extensions inutiles pour réduire le fardeau en arrière-plan; 2. Activer la fonction "tag de sommeil" pour réduire l'utilisation des ressources de balise inactive; 3. Nettoyez le processus d'arrière-plan et fermez les paramètres liés au rendu GPU; 4. Mettez à jour le navigateur et le système pour assurer la compatibilité et l'optimisation des performances.

La classe facultative est utilisée pour gérer en toute sécurité les valeurs qui peuvent être nuls, en évitant les exceptions de pointeur nul. 1. Créez une instance en utilisant Facultatif.Ofnullable pour gérer les valeurs nulles. 2. Vérifiez et accédez aux valeurs via une sécurité ISPRESENT ou IFPRESENT pour éviter un appel direct pour provoquer des exceptions. 3. Utilisez Orelse et Orelseget pour fournir des valeurs par défaut, ou utilisez OrelSethrow pour lancer une exception personnalisée. 4. Convertir ou filtrer les valeurs par le biais des opérations de la chaîne de carte et de filtre pour améliorer la lisibilité du code et la robustesse.

La manipulation des exceptions Java attrape des exceptions via les blocs de capture d'essai, les blocs finissent par s'assurer que le nettoyage des ressources, les ressources essai avec les ressources, gèrent automatiquement les ressources, lance des exceptions, les exceptions personnalisées pour gérer les erreurs spécifiques et suit les meilleures pratiques telles que la capture d'exceptions spécifiques, et non les exceptions, et d'éviter les blocs de capture vides, ainsi en train d'obtenir un code robuste et maintenable.
