Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 7)

javathread.jpeg

Modèle producteur-consommateur

Un producteur est un thread qui crée des données et un consommateur est un thread qui utilise des données. Lorsque le producteur et le consommateur fonctionnent comme des threads séparés, la différence de vitesse de traitement entre les deux devient un problème. ** Les données n'ont pas encore été créées lorsque le consommateur tente de recevoir les données, ou le consommateur n'est pas prêt à recevoir les données lorsque le producteur tente de transmettre les données **. Dans le modèle producteur-consommateur, il existe un «pont» entre les producteurs et les consommateurs. Ce pont comble le vide dans la vitesse de traitement entre les threads. Lorsque le producteur et le consommateur sont tous deux singuliers, on l'appelle parfois le ** modèle de tuyau **.

Prenons un exemple où trois cuisiniers font un gâteau et le mettent sur la table, trois clients le mangent et jusqu'à trois gâteaux peuvent être mis sur la table. S'il y a trois gâteaux sur la table et que le coq essaie de mettre plus de gâteaux sur la table, le coq attend qu'il y ait de la place pour le mettre sur la table. Si un client essaie de prendre un gâteau de la table alors qu'aucun gâteau n'est posé sur la table, le client devra attendre que le gâteau soit placé.

(Voir ce manuel pour le code complet)

MakerThread


public class MakerThread extends Thread { 
    ...
    private static int id = 0; //ƒ Numéro de série du gâteau(Commun à tous les coqs)
    ...
    public void run() { 
        try { 
            while (true) { 
                Thread.sleep(random.nextInt(1000)); 
                String cake = "[ Cake No." + nextId() + " by " + getName() + " ]"; 
                table.put(cake); 
            } 
        } catch (InterruptedException e) { 
        } 
    } 
    private static synchronized int nextId() { 
        return id++; 
    } 
}

EaterThread



public class EaterThread extends Thread { 
    ...
    public void run() { 
        try { 
            while (true) { 
                String cake = table.take(); 
                Thread.sleep(random.nextInt(1000)); 
            } 
        } catch (InterruptedException e) { 
        } 
    }
    ...

Table


public class Table { 
    private final String[] buffer; 
    private int tail;  //Où mettre ensuite
    private int head;  //Prochain endroit à prendre
    private int count; //Nombre de gâteaux dans le tampon
    ...
    //Mettez le gâteau
    public synchronized void put(String cake) throws InterruptedException { 
        System.out.println(Thread.currentThread().getName() + " puts " + cake); 
        while (count >= buffer.length) { 
            wait(); 
        } 
        buffer[tail] = cake; 
        tail = (tail + 1) % buffer.length; 
        count++; 
        notifyAll(); 
    } 
    //Prendre le gâteau
    public synchronized String take() throws InterruptedException { 
        while (count <= 0) { 
            wait(); 
        } 
        String cake = buffer[head]; 
        head = (head + 1) % buffer.length; 
        count--; 
        notifyAll(); 
        System.out.println(Thread.currentThread().getName() + " takes " + cake); 
        return cake; 
    } 
}

Résultat d'exécution


...
MakerThread-1 puts [ Cake No.10 by MakerThread-1 ]
EaterThread-1 takes [ Cake No.10 by MakerThread-1 ]
MakerThread-1 puts [ Cake No.11 by MakerThread-1 ]
EaterThread-3 takes [ Cake No.11 by MakerThread-1 ]
MakerThread-3 puts [ Cake No.12 by MakerThread-3 ]
MakerThread-3 puts [ Cake No.13 by MakerThread-3 ]
EaterThread-2 takes [ Cake No.12 by MakerThread-3 ]
EaterThread-3 takes [ Cake No.13 by MakerThread-3 ]
...

Personnage

Rôle des données: Créé par le rôle Producteur et utilisé par le rôle Consumer. Dans l'exemple ci-dessus, c'est le gâteau. Rôle du producteur: Créez un rôle Data et transmettez-le au rôle Channel. Dans l'exemple ci-dessus, il s'agit de la classe MakerThread. Rôle du consommateur: Recevez le rôle Data du rôle Channel et utilisez-le. Dans l'exemple ci-dessus, il s'agit de la classe EaterThread. Rôle du canal: Reçoit le rôle Data du rôle Producer, le stocke et transmet le rôle Data en réponse à une demande du rôle Consumer. Un contrôle exclusif est effectué pour l'accès depuis le rôle Producteur et le rôle Consommateur. Le rôle Channel se situe entre le rôle Producer et le rôle Consumer, et joue le rôle d'un point relais et d'un chemin de communication pour transmettre le rôle Data. Dans l'exemple ci-dessus, il s'agit de la classe Table.

Conseils pour élargir vos pensées

Même si le thread attend avec wait, il peut être annulé de la même manière que sleep. Vous pouvez utiliser la méthode d'interruption pour dire au thread en attente: «Vous n'avez plus à attendre notifier / notifierAll. Sortez de l'attente». Cependant, en cas d'attente, vous devez faire attention au verrouillage. Le fil avait relâché le verrou une fois lorsqu'il est entré dans le jeu de poids. Le thread qui a été appelé interruption pendant l'attente (c'est-à-dire le thread qui a été annulé) récupère le verrou, puis lève une InterruptedException. Autrement dit, vous ne pouvez pas lever d'exception InterruptedException tant que ** le verrou n'est pas pris **.


Relation Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 1) Résumé de "Modèles de conception appris en langage Java (édition multithread)" (Partie 2) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 3) Résumé de «Modèles de conception appris en langage Java (édition multi-thread)» (Partie 4) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 5) Résumé de «Modèles de conception appris en langage Java (édition multi-thread)» (Partie 6)

Recommended Posts

Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 10)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 7)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 3)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 9)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 6)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 4)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 5)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 2)
Résumé de «Modèles de conception appris en langage Java (édition multi-thread)» (Partie 1)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 11)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 12)
Résumé de «Modèles de conception appris en langage Java (édition multithread)» (partie 8)
[Java] Résumé des modèles de conception
Un examen rapide de Java appris en classe part4
Résumé des bases du langage Java
Un examen rapide de Java appris en classe part3
Un examen rapide de Java appris en classe part2
J'ai lu Hiroshi Yuki "Introduction aux modèles de conception appris en langage Java" (SB Creative)
Modèles de conception Java
Ce que j'ai appris en Java (partie 2) Que sont les variables?
Un examen rapide de Java appris en classe
Résumé de ce que j'ai appris dans Spring Batch
Essayez les modèles de conception en langage C! Modèle de souvenir - mémorisons les souvenirs des données
[Java] Résumé de base de Java non couvert par Progate ~ Partie 1 ~
Ce que j'ai appris en Java (partie 3) Déclaration d'exécution des instructions
Résumé de la mise en œuvre des arguments par défaut en Java
Résumé du support Java 2018
Résumé du modèle de conception Java
Ce que j'ai appris en Java (partie 4) Branchement conditionnel et répétition
[Java] Résumé de base de Java non couvert par Progate ~ Partie 2 ・ Liste ~
Road to Java Engineer Part2 Quel type de langage est Java?
[Java11] Résumé du flux -Avantages du flux-
[Java] Résumé des expressions régulières
[Java] Résumé des opérateurs (opérateur)
Résumé de la classe Java Math
[Java] Résumé de la syntaxe de contrôle
Implémentation Java de tri-tree
Résumé du traitement des erreurs Java
[Java] Résumé des opérations mathématiques
Ce que j'ai appris en Java (partie 1) Flux de développement Java et présentation
Résumé de l'ORM "uroboroSQL" qui peut être utilisé dans le Java d'entreprise
[Pour les débutants] Résumé du constructeur java
Résumé du package [Java Silver Study]
Utilisation de base de Java Facultatif Partie 1
processus thread-safe en java
Résumé de l'algorithme AtCoder 400 points (édition Java)
Liste des membres ajoutés dans Java 9
Faire une analyse de phrase en Java 8 (partie 2)
Liste des types ajoutés dans Java 9
Résumé de la programmation orientée objet utilisant Java
Implémentation d'une fonction similaire en Java
Création d'une analyse de phrase dans Java 8 (partie 1)