Sur la plate-forme Java, les rôles qui implémentent les appels asynchrones ont les trois rôles suivants: les données réelles de l'appelant dans le projet de loi
Lorsqu'un appelant appelle une opération chronophage et ne peut pas renvoyer des données immédiatement, il rendra d'abord un acte de fosse.
Allez à la gâteau pour acheter des gâteaux, vous n'avez pas besoin d'attendre que le gâteau soit fabriqué (en supposant qu'il faut beaucoup de temps pour le faire), il vous suffit d'obtenir un acte de gardien (allez faire autre chose) .
classe publique main {public static void Main (String [] args) {System.out.println ("Main Begin"); hôte hôte = nouveau hôte (); data2 = host.request (20, «b»); Catch (InterruptedException E) {} System.out.println ("MAIN OUTRJOB END"); data2 .getContent ());
La classe principale ici est équivalente à "Client", et l'hôte est équivalent à "Cake Shop". équivaut à ramasser les marchandises. Après une période de temps (après avoir dormi pendant une période), appelez Data1.getContent (), ce qui signifie obtenir le projet de loi pour obtenir le résultat de l'exécution.
Jetons un coup d'œil à ce que le salon a fait après que le client a commandé le gâteau:
Classe publique Host {Public Data Demande (Final Int Count, Final Char C) {System.out.println ("Request (" + Count + "," + C + ") Begin"); Entité final futuredata future = new Futuredata (); classe intérieure. RealData realdata = new realData (count, c); // (3) Récupérer l'entité FuturedAdata comme la valeur de retour Retour Future;
Après avoir reçu la demande, l'hôte ("Cake Shop") est devenu un avenir d'instance de "Book of Lading" Futuredata, puis a commandé le "Cake Maker" Realdata pour faire le gâteau. . Ensuite, ce que l'hôte revient au client n'est que l'avenir du "livre des lading", pas du gâteau. Une fois le gâteau terminé, le Cake Maker peut donner le gâteau «Livre de lading» correspondant, c'est-à-dire futur.setRealdata (realdata).
Jetons un coup d'œil à la façon dont le fabricant de gâteaux fabrique des gâteaux:
Créez une chaîne contenant des caractères C décompte.
classe publique RealData implémente les données {Contenu de la chaîne finale privée; public realData (int count, char c) {System.out.println ("Making RealData (" + Count + "," + C + ") Begin"); Buffer = nouveau char [count]; .println ("Making RealData (" + Count + "," + C + ") end");
Voyons maintenant comment l'avenir de «Bill of Lading» correspond au «contenu» du gâteau:
classe publique Futuredata implémente les données {private realdata realdata = null; private boolean ready = false; } this.realdata = realData; ();}}
Une fois que le client a terminé sa propre entreprise, il prendra son propre "livre de lading" pour ramasser le gâteau:
System.out.println ("data1 =" + data1.getContent ());
Si le gâteau n'est pas prêt, vous devez attendre:
while (! Ready) {try {wait ();} catch (interruptedException e) {} // ne renvoie que realdata.getContent () peut être obtenu après son fait;
Analyse du programme
Pour chaque demande, l'hôte générera un fil, qui est responsable de la génération du "gâteau" nécessaire par le client. Après avoir attendu un certain temps, si le gâteau n'est pas prêt, les clients doivent attendre. Le client ne peut enlever le gâteau que jusqu'à ce que le «gâteau soit fait», c'est-à-dire Future.SetRealData (realdata);
Chaque fil est simplement responsable de la fabrication du «gâteau» dont un client spécifique a besoin. C'est-à-dire que le client A correspond à Cake Master A, et le client B correspond à Cake Master B. Même si le gâteau du client B est préparé en premier, le client A ne peut qu'attendre que le maître de gâteau A prépare le gâteau. En d'autres termes, il n'y a pas de relation concurrentielle entre les clients.
Deux méthodes de futuredata sont réglées à la synchronisation. peu importe si le gâteau est prêt.
C'est partout dans cet article.