国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

Maison Java Javacommencer Qu'est-ce que la file d'attente Java

Qu'est-ce que la file d'attente Java

Nov 14, 2019 am 10:56 AM
java file d'attente

Qu'est-ce que la file d'attente Java

La file d'attente est un tableau linéaire spécial qui suit le principe du "premier entré, premier sorti". Dans notre utilisation quotidienne, nous l'utilisons souvent pour manipuler des données simultanément. En programmation concurrente, il est parfois nécessaire d'utiliser des files d'attente thread-safe. Si vous souhaitez implémenter une file d'attente thread-safe, il existe généralement deux manières?: l'une consiste à utiliser une file d'attente de blocage et l'autre consiste à utiliser un verrou de synchronisation de thread.

Qu'est-ce qu'une file d'attente bloquante??

Supposons qu'il y ait une boulangerie avec un client qui mange du pain et un chef qui prépare du pain. Un maximum de 2 miches de pain peuvent être placées dans le panier. Une fois le test terminé, le chef met le pain dans le panier et lorsque les invités mangent le pain, ils le sortent du panier afin de s'en assurer. il y a du pain dans le panier lorsque les invités mangent le pain ou le panier ne déborde pas lorsque le chef fait cuire le pain. à ce stade, nous devons introduire le concept de file d'attente bloquante, ce que nous appelons souvent le modèle producteur-consommateur. .

Une file d'attente bloquante est une file d'attente qui prend en charge deux opérations supplémentaires. Ces deux opérations supplémentaires prennent en charge les méthodes de blocage d’insertion et de suppression.

(1) Prise en charge de la méthode d'insertion bloquante?: ce qui signifie que lorsque la file d'attente est pleine, la file d'attente bloquera le thread insérant des éléments jusqu'à ce que la file d'attente ne soit pas pleine.

(2) Prend en charge la méthode de suppression de blocage?: cela signifie que lorsque la file d'attente est vide, le thread qui obtient l'élément attendra que la file d'attente ne devienne pas vide. Les files d'attente de blocage sont souvent utilisées dans les scénarios de producteur et de consommateur. Le producteur est le thread qui ajoute des éléments à la file d'attente et le consommateur est le thread qui extrait les éléments de la file d'attente. Une file d'attente de blocage est un conteneur utilisé par les producteurs pour stocker des éléments et par les consommateurs pour obtenir des éléments.

Aucune file d'attente bloquante dans le système?: PriorityQueue et ConcurrentLinkedQueue

Jetons un coup d'?il à la relation entre les files d'attente non bloquantes (en prenant PriorityQueue comme exemple)?:

Quest-ce que la file dattente Java

La classe PriorityQueue hérite de AbstractQueue et implémente l'interface Serialisable. Maintenant essentiellement une liste ordonnée, PriorityQueue se trouve dans le package utilitaire Java. Le mot Priority dans la première moitié de son nom signifie priorité. En fait, cette file d'attente a "priorité". Les éléments ajoutés à la file d'attente sont positionnés selon leur ordre naturel (via son implémentation java.util.Comparable) ou selon l'implémentation java.util.Comparator transmise au constructeur.

ConcurrentLinkedQueue est une file d'attente thread-safe basée sur des n?uds liés. L'accès simultané ne nécessite pas de synchronisation. Parce qu'il ajoute des éléments à la queue de la file d'attente et les supprime de la tête, l'accès partagé de ConcurrentLinkedQueue à une collection commune fonctionne très bien sans conna?tre la taille de la file d'attente. La collecte d'informations sur la taille de la file d'attente sera lente et nécessite de parcourir la file d'attente?; ConcurrentLinkedQueue est une file d'attente thread-safe illimitée basée sur des n?uds liés. Elle utilise une règle du premier entré, premier sorti pour trier les n?uds. il sera ajouté à la queue de la file d'attente?; lorsque nous obtenons un élément, il renvoie l'élément en tête de la file d'attente.

File d'attente qui implémente l'interface de blocage?:

L'interface BlockingQueue et cinq classes de file d'attente de blocage sont ajoutées à java.util.concurrent. Il s'agit essentiellement d'une structure de données FIFO avec une particularité. Plut?t que d'ajouter ou de supprimer immédiatement des éléments de la file d'attente, le thread exécutant l'opération se bloque jusqu'à ce qu'un espace ou un élément devienne disponible.

Les cinq files d'attente en proposent différentes?:

·ArrayBlockingQueue?: une file d'attente limitée soutenue par un tableau.

·LinkedBlockingQueue?: une file d'attente délimitée facultative soutenue par des n?uds liés.

·PriorityBlockingQueue?: une file d'attente prioritaire illimitée soutenue par un tas prioritaire.

·DelayQueue?: une file d'attente de planification basée sur le temps soutenue par un tas prioritaire.

·SynchronousQueue?: Un mécanisme de rendez-vous simple utilisant l'interface BlockingQueue.

Jetons un coup d'?il à la relation d'héritage entre ArrayBlockingQueue et LinkedBlockingQueue?:

Quest-ce que la file dattente Java

Quest-ce que la file dattente Java

En examinant la relation d'héritage entre les deux classes, nous pouvons savoir qu'elles héritent également de AbstractQueue et implémentent l'interface Serialisable ; la différence est qu'elles implémentent également l'interface BlockingQueue.

Une brève introduction à certains d'entre eux?:

LinkedBlockingQueueLa taille par défaut de LinkedBlockingQueue est Integer.MAX_VALUE, qui peut être comprise comme une file d'attente délimitée en cache. Vous pouvez choisir de spécifier sa capacité maximale. Il s'agit d'une file d'attente basée sur une liste cha?née. (premier entré, premier sorti). Lorsque le producteur place une donnée dans la file d'attente, elle est mise en cache dans la file d'attente. Lorsque le tampon de la file d'attente atteint la capacité maximale du cache (LinkedBlockingQueue peut spécifier cette valeur via le constructeur), la file d'attente du producteur est bloquée jusqu'à ce que le consommateur consomme du. file d'attente Lorsqu'une donnée est supprimée, le thread producteur sera réveillé, et vice versa pour les consommateurs.

ArrayBlockingQueue doit spécifier la capacité lors de la construction, et vous pouvez choisir si l'équité est requise. Si le paramètre d'équité est défini sur true, le thread avec le temps d'attente le plus long sera traité en premier (en fait, cela est obtenu en définissant ReentrantLock sur). vrai Ce genre d'équité : c'est-à-dire que le thread avec le temps d'attente le plus long fonctionnera en premier). Généralement, l’équité vous co?tera en performance, alors utilisez-la uniquement lorsque vous en avez vraiment besoin. Il s'agit d'une file d'attente circulaire de blocage basée sur un tableau qui trie les éléments selon le principe FIFO (premier entré, premier sorti).

PriorityBlockingQueue est une file d'attente prioritaire, pas une file d'attente premier entré, premier sorti. Les éléments sont supprimés par ordre de priorité et la file d'attente n'a pas de limite supérieure (après avoir examiné le code source, PriorityBlockingQueue est un repackage de PriorityQueue, basé sur la structure de données du tas, et PriorityQueue n'a pas de limite de capacité, comme ArrayList, donc en priorité Elle ne sera pas bloquée lors de la mise en file d'attente de blocage. Bien que cette file d'attente soit logiquement illimitée, tenter d'effectuer une opération d'ajout peut provoquer une OutOfMemoryError car les ressources sont épuisées), mais si la file d'attente est vide, l'opération de prise du L'élément est bloqué, donc son opération de récupération est bloquée. De plus, les éléments entrant dans la file d'attente doivent avoir des capacités de comparaison.

à propos de ConcurrentLinkedQueue et LinkedBlockingQueue?:

peut également être compris comme la différence entre la file d'attente bloquante et la file d'attente non bloquante?:

1. mécanisme de verrouillage. ConcurrentLinkedQueue utilise l'algorithme CAS, bien que l'acquisition du verrou sous-jacent de LinkedBlockingQueue utilise également l'algorithme CAS.

2. Concernant la récupération d'éléments, ConcurrentLinkedQueue ne prend pas en charge le blocage pour récupérer des éléments, et LinkedBlockingQueue prend en charge la méthode de blocage take().

3. Concernant les performances d'insertion d'éléments, en utilisation réelle, notamment sur les serveurs multi-CPU, la différence entre verrouillage et sans verrouillage se reflètera beaucoup plus rapidement que LinkedBlockingQueue.

Code producteur-consommateur?:

J'ai vu un petit exemple de producteur-consommateur sur Internet, ce qui est très utile pour comprendre les files d'attente de blocage. Le code est le suivant. suit?:

import java.util.concurrent.ArrayBlockingQueue;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
 
public class BlockingQueueTest {
    public static class Basket {
        BlockingQueue<String> basket = new ArrayBlockingQueue<>(3);
 
        private void produce() throws InterruptedException {
            basket.put("蘋(píng)果");
        }
 
        private void consume() throws InterruptedException {
            basket.take();
        }
 
        private int getAppleNumber() {
            return basket.size();
        }
    }
 
    private static void testBasket() {
        final Basket basket = new Basket();
        class Producer implements Runnable {
            public void run() {
                try {
                    while (true) {
                        System.out.println("生產(chǎn)者開(kāi)始生產(chǎn)蘋(píng)果###");
                        basket.produce();
                        System.out.println("生產(chǎn)者生產(chǎn)蘋(píng)果完畢###");
                        System.out.println("籃子中的蘋(píng)果數(shù)量:" + basket.getAppleNumber() + "個(gè)");
                        Thread.sleep(300);
                    }
                } catch (InterruptedException e) {}
            }
        }
 
        class Consumer implements Runnable {
            public void run() {
                try {
                    while (true) {
                        System.out.println("消費(fèi)者開(kāi)始消費(fèi)蘋(píng)果***");
                        basket.consume();
                        System.out.println("消費(fèi)者消費(fèi)蘋(píng)果完畢***");
                        System.out.println("籃子中的蘋(píng)果數(shù)量:" + basket.getAppleNumber() + "個(gè)");
                        Thread.sleep(1000);
                    }
                } catch (InterruptedException e) {}
            }
        }
        ExecutorService service = Executors.newCachedThreadPool();
        Producer producer = new Producer();
        Consumer consumer = new Consumer();
        service.submit(producer);
        service.submit(consumer);
        try {
            Thread.sleep(10000);
        } catch (InterruptedException e) {}
        service.shutdownNow();
    }
 
    public static void main(String[] args) {
        BlockingQueueTest.testBasket();
    }
}

De nombreusesvidéos de formation Java, toutes sur le site PHP chinois, bienvenue pour apprendre en ligne !

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!

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

Outils d'IA chauds

Undress AI Tool

Undress AI Tool

Images de déshabillage gratuites

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Clothoff.io

Clothoff.io

Dissolvant de vêtements AI

Video Face Swap

Video Face Swap

échangez les visages dans n'importe quelle vidéo sans effort grace à notre outil d'échange de visage AI entièrement gratuit?!

Article chaud

Outils chauds

Bloc-notes++7.3.1

Bloc-notes++7.3.1

éditeur de code facile à utiliser et gratuit

SublimeText3 version chinoise

SublimeText3 version chinoise

Version chinoise, très simple à utiliser

Envoyer Studio 13.0.1

Envoyer Studio 13.0.1

Puissant environnement de développement intégré PHP

Dreamweaver CS6

Dreamweaver CS6

Outils de développement Web visuel

SublimeText3 version Mac

SublimeText3 version Mac

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

Sujets chauds

Tutoriel PHP
1502
276
Comment gérer les transactions en Java avec JDBC? Comment gérer les transactions en Java avec JDBC? Aug 02, 2025 pm 12:29 PM

Pour gérer correctement les transactions JDBC, vous devez d'abord désactiver le mode de validation automatique, puis effectuer plusieurs opérations, et enfin vous engager ou randonner en fonction des résultats; 1. Appelez Conn.SetAutoCommit (false) pour démarrer la transaction; 2. Exécuter plusieurs opérations SQL, telles que l'insertion et la mise à jour; 3. Appelez Conn.Commit () Si toutes les opérations sont réussies, et appelez Conn.Rollback () Si une exception se produit pour garantir la cohérence des données; Dans le même temps, les ressources TRY-With doivent être utilisées pour gérer les ressources, gérer correctement les exceptions et cl?turer les connexions pour éviter la fuite de connexion; De plus, il est recommandé d'utiliser des pools de connexion et de définir des points de sauvegarde pour réaliser un retour en arrière partiel, et de maintenir les transactions aussi courtes que possible pour améliorer les performances.

Comparaison des frameworks Java: Spring Boot vs Quarkus vs MicronAut Comparaison des frameworks Java: Spring Boot vs Quarkus vs MicronAut Aug 04, 2025 pm 12:48 PM

Pré-formancetartuptimemoryusage, quarkusandmicronautleadduetocompile-timeprocessingandgraalvsupport, withquarkusofperforming lightbetterine scénarios.

Passez l'exemple de l'exemple de journalisation du middleware http Passez l'exemple de l'exemple de journalisation du middleware http Aug 03, 2025 am 11:35 AM

HTTP Log Middleware dans GO peut enregistrer les méthodes de demande, les chemins de requête, la propriété intellectuelle du client et le temps qui prend du temps. 1. Utilisez http.handlerfunc pour envelopper le processeur, 2. Enregistrez l'heure de début et l'heure de fin avant et après l'appel Suivant.Servehttp, 3. Obtenez le vrai client IP via R.RemoteAddr et X-Forwared-For Headers, 4. Utilisez le log.printf aux journaux de demande de sortie, 5. L'exemple de code complet a été vérifié pour s'exécuter et convient au démarrage d'un projet petit et moyen. Les suggestions d'extension incluent la capture des codes d'état, la prise en charge des journaux JSON et le suivi des ID de demande.

Comment fonctionne la collection Garbage en Java? Comment fonctionne la collection Garbage en Java? Aug 02, 2025 pm 01:55 PM

La collecte des ordures de Java (GC) est un mécanisme qui gère automatiquement la mémoire, ce qui réduit le risque de fuite de mémoire en récupérant des objets inaccessibles. 1. GC juge l'accessibilité de l'objet de l'objet racine (tel que les variables de pile, les threads actifs, les champs statiques, etc.), et les objets inaccessibles sont marqués comme des ordures. 2. Sur la base de l'algorithme de compensation de marque, marquez tous les objets accessibles et effacez des objets non marqués. 3. Adopter une stratégie de collecte générationnelle: la nouvelle génération (Eden, S0, S1) exécute fréquemment MinorGC; Les personnes agées fonctionnent moins, mais prend plus de temps pour effectuer MajorGC; Metaspace Stores Metadata de classe. 4. JVM fournit une variété de périphériques GC: SerialGC convient aux petites applications; Le parallelGC améliore le débit; CMS réduit

Utilisation de types HTML ?Entrée? pour les données utilisateur Utilisation de types HTML ?Entrée? pour les données utilisateur Aug 03, 2025 am 11:07 AM

Le choix du bon type HTMLinput peut améliorer la précision des données, améliorer l'expérience utilisateur et améliorer la convivialité. 1. Sélectionnez les types d'entrée correspondants en fonction du type de données, tels que le texte, le courrier électronique, le tel, le numéro et la date, qui peuvent vérifier automatiquement la somme de la somme et l'adaptation au clavier; 2. Utilisez HTML5 pour ajouter de nouveaux types tels que l'URL, la couleur, la plage et la recherche, qui peuvent fournir une méthode d'interaction plus intuitive; 3. Utilisez l'espace réservé et les attributs requis pour améliorer l'efficacité et la précision du remplissage des formulaires, mais il convient de noter que l'espace réservé ne peut pas remplacer l'étiquette.

Comparaison des outils de construction Java: Maven vs Gradle Comparaison des outils de construction Java: Maven vs Gradle Aug 03, 2025 pm 01:36 PM

GradleisthebetterChoiceFormostNewProjectsDuetOtsSuperiorflexibility, Performance et ModerNtoolingSupport.1.gradle’sgroovy / kotlindslismoreConcis

Comment utiliser le modèle d'observateur en Java? Comment utiliser le modèle d'observateur en Java? Aug 02, 2025 am 11:52 AM

La réponse claire à cette question est la recommandation d'implémenter le modèle d'observateur à l'aide d'une interface d'observateur personnalisée. 1. Bien que Java offre observable et observateur, le premier est une classe et a été obsolète et manque de flexibilité; 2. La pratique recommandée moderne consiste à définir une interface d'observateur fonctionnel, et le sujet maintient la liste des observateurs et informe tous les observateurs lorsque l'état change; 3. Il peut être utilisé en combinaison avec les expressions de lambda pour améliorer la simplicité et la maintenabilité du code; 4. Pour les scénarios GUI ou Javabean, PropertyChangeListener peut être utilisé. Par conséquent, les nouveaux projets devraient adopter un schéma d'interface d'observateur personnalisé, qui est sécurisé, facile à tester et se spécialise dans le Java moderne

Comment lire un fichier CSV en Java? Comment lire un fichier CSV en Java? Aug 03, 2025 am 11:56 AM

L'utilisation de la bibliothèque OpenCSV est le meilleur choix pour lire les fichiers CSV. Il peut gérer des situations complexes et prend en charge plusieurs fonctionnalités; 2. Pour les fichiers CSV simples, vous pouvez utiliser BufferedReader intégré de Java combiné avec la méthode Split; 3. Si vous avez besoin d'un contr?le de format plus flexible ou si vous avez utilisé des composants Apache, vous pouvez choisir Apache Commonscsv. OpenCSV est recommandé pour sa simplicité, sa robustesse et sa capacité à gérer les problèmes de CSV dans des scénarios réels.

See all articles