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

javathread.jpeg

Modèle futur

Supposons que vous ayez une méthode qui prend beaucoup de temps pour obtenir le résultat de l'exécution. ** Obtenez un bon au lieu d'attendre le résultat de l'exécution **. Il ne faut pas longtemps pour obtenir un bon. Le bon à ce moment s'appelle le rôle Future. Le thread qui a reçu le voucher utilisera plus tard le rôle Future pour recevoir le résultat de l'exécution. Si le résultat de l'exécution est disponible, vous le recevrez immédiatement, et sinon, vous attendez de pouvoir.

(Voir ce manuel pour le code complet)

Main.java


public class Main { 
    public static void main(String[] args) { 
        ...
        Host host = new Host(); 
        Data data1 = host.request(10, 'A'); 
        Data data2 = host.request(20, 'B'); 
        Data data3 = host.request(30, 'C'); 

        try { 
            Thread.sleep(2000); 
        } catch (InterruptedException e) { 
        } 
 
        System.out.println("data1 = " + data1.getContent()); 
        System.out.println("data2 = " + data2.getContent()); 
        System.out.println("data3 = " + data3.getContent()); 
    } 
}

Host.java


public class Host { 
    public Data request(final int count, final char c) { 
        final FutureData future = new FutureData();  //Créer un bon

        new Thread() { 
            public void run() { 
                RealData realdata = new RealData(count, c); 
                future.setRealData(realdata); 
            } 
        }.start(); 

        return future;  //Bon de retour
    } 
}

Data.java


public interface Data { 
    public abstract String getContent(); 
}

Future.java


public class FutureData implements Data { 
    private RealData realdata = null; 
    private boolean ready = false; 
    public synchronized void setRealData(RealData realdata) { 
        if (ready) { 
            return;     // balk 
        } 
        this.realdata = realdata; 
        this.ready = true; 
        notifyAll(); 
    } 
    public synchronized String getContent() { 
        while (!ready) { 
            try { 
                wait(); 
            } catch (InterruptedException e) { 
            } 
        } 
        return realdata.getContent(); 
    } 
}

La classe Host crée d'abord une instance de FutureData. Cette instance est la valeur de retour. Puis démarrez un nouveau thread et créez une instance de RealData dedans. La création d'une instance de RealData prend du temps. Une fois l'instance créée, appelez la méthode setRealData pour la définir dans l'instance FutureData.

La classe FureData est une classe de bon. Le champ realData est un champ qui contient une instance de RealData qui sera créée. Ce champ est attribué par la méthode setRealData. La méthode getContent est une méthode pour obtenir les données réelles. Attendez que realdata soit défini par setRealData. S'il est défini, il retourne immédiatement, et s'il n'est pas défini, il attend. Les threads en attente sont réveillés en appelant notifyAll dans setRealData.

Personnage

Rôle du client Le rôle Client fait une demande au rôle Host et reçoit immédiatement le rôle VirtualData en conséquence (valeur de retour). Le rôle VirtualData reçu ici est en fait le rôle Future. Le rôle Client n'a pas besoin de savoir si la valeur de retour est un rôle RealData ou un rôle Future. Dans l'exemple de programme, la classe Main a joué ce rôle.

Rôle hôte Le rôle Host crée un nouveau thread et commence à créer le rôle RealData. D'autre part, le rôle Future est retourné au rôle Client en tant que rôle Virtual Data. Dans l'exemple de programme, la classe Host a joué ce rôle.

Rôle de données virtuelles Le rôle VirtualData est un rôle qui assimile le rôle Future au rôle RealData. Dans l'exemple de programme, l'interface de données a joué ce rôle.

Rôle de données réelles Le rôle RealData est un rôle qui représente des données réelles. La création de cet objet prend du temps. Dans l'exemple de programme, la classe RealData a joué ce rôle.

Rôle futur Le rôle Future est un rôle passé du rôle Host au rôle Client en tant que voucher pour le rôle RealData. Le rôle Future se comporte comme un rôle Virtual Data pour le rôle Client. Lorsqu'il est exploité à partir du rôle Client, le thread attend avec attente que le rôle RealData soit terminé. Dans l'exemple de programme, la classe FureData a joué ce rôle.

Conseils pour élargir vos pensées

Le rôle du futur qui ne peut pas attendre Il est également possible d'implémenter la méthode getContent de manière asynchrone. Au lieu de l'histoire déroutante de la création d'un nouveau thread dans la méthode getContent, vous pouvez utiliser le modèle Balking pour «rentrer à la maison si vous ne pouvez pas».

Modèle de rappel et futur Si vous souhaitez attendre la fin du traitement et obtenir la valeur de retour, vous pouvez penser à une méthode appelée ** callback **. Le rappel est une méthode dans laquelle le thread démarré par le rôle Hôte lorsque le traitement est terminé rappelle la méthode du rôle Client.


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 multi-thread)" (Partie 5) Résumé de «Modèles de conception appris en langage Java (édition multi-thread)» (Partie 6) Résumé de «Modèles de conception appris en langage Java (édition multi-thread)» (Partie 7) Résumé de «Modèles de conception appris en langage Java (édition multi-thread)» (Partie 8) Résumé de «Modèles de conception appris en langage Java (édition multi-thread)» (Partie 9) Résumé de «Modèles de conception appris en langage Java (édition multithread)» (Partie 10)

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)
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
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
[Pour les débutants] Résumé du constructeur java
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
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)