Auf der Java -Plattform haben die Rollen, die asynchrone Anrufe implementieren
Wenn ein Anrufer einen zeitaufwändigen Betrieb anruft und keine Daten sofort zurückgeben kann, wird er zunächst einen Frachtbrief zurückgeben.
Gehen Sie in den Kuchenladen, um Kuchen zu kaufen. Sie müssen nicht darauf warten, dass der Kuchen hergestellt wird (vorausgesetzt, es dauert lange, bis es geschafft wird), müssen Sie nur eine Frachtrechnung bekommen (gehen Sie, um etwas anderes zu tun). Wenn der Kuchen fertig ist, kann der Kuchen in Ordnung sind.
public class main {public void main (String [] args) {system.out.println ("Hauptstart"); Data2 = Host.Request (20, 'B'); catch (InterruptedException e) {} System.out.println ("Main OtherJob End"); Data2 .GetContent ());
Die Hauptklasse hier entspricht "Kunde", und der Host entspricht "Cake Shop". ist gleichbedeutend mit dem Aufnehmen der Ware. Nach einem Zeitraum (nach einem bestimmten Zeitraum) rufen Sie Daten1.GetContent () auf, was bedeutet, die Frachtbrief zu erhalten, um das Ausführungsergebnis zu erhalten.
Schauen wir uns an, was der Cake Shop getan hat, nachdem der Kunde den Kuchen bestellt hat:
public class Host {öffentliche Datenanforderung (endgültige int count, endgültig ch) {System.out.println ("Request (" + count + "," + c + "); Entity Final Futuredata Future = New Futureedata (); innere Klasse. Redata realdata = neu readata (count, c); // (3) die FutureData -Entität als Rückgabewert zurückrufen}}};
Nach Erhalt der Anfrage wurde der Gastgeber ("Cake Shop") eine Instanzkünftige von "Book of Lading" Futureedata und bestellte dann den "Cake Maker" Realdata, um den Kuchen zu machen. . Dann ist das, was der Gastgeber zum Kunden zurückkehrt, nur die Zukunft "Buch der Frachtläer", nicht der Kuchen. Nachdem der Kuchen fertig ist, kann der Kuchenhersteller den entsprechenden "Buch der Frachtlädiger", dh Future.setRealData (Readata), geben.
Schauen wir uns an, wie der Kuchenhersteller Kuchen macht:
Erstellen Sie eine Zeichenfolge mit Zähl -C -Zeichen.
öffentliche Klasse Readata implementiert Daten {private String -Inhalte; Puffer = neu [Count]; .Println ("Readata machen (" + count + "," + c + ");
Schauen wir uns nun an, wie die Zukunft der "Frachtbrief" dem "Inhalt" des Kuchens entspricht:
öffentliche Klasse futureData implementiert Daten {private realdata readata = null; } this.RealData = readtata; ();
Nachdem der Kunde sein eigenes Geschäft beendet hat, wird er sein eigenes "Book of Lading" nehmen, um den Kuchen abzuholen:
System.out.println ("data1 =" + data1.getContent ());
Wenn der Kuchen nicht fertig ist, müssen Sie warten:
while (! Ready) {try {wait ();
Programmanalyse
Für jede Anfrage generiert Host einen Thread, der für die Erzeugung des vom Kunden benötigten "Kuchen" verantwortlich ist. Nach einer Weile müssen die Kunden warten, wenn der Kuchen nicht fertig ist. Der Kunde kann den Kuchen nur wegnehmen, bis der "Kuchen gemacht" ist.
Jeder Thread ist nur dafür verantwortlich, den "Kuchen" zu erstellen, den ein bestimmter Kunde benötigt. Das heißt, der Kunde A entspricht dem Kuchen Master A und des Kunden B entspricht dem Kuchen Master B. Selbst wenn der Kuchen von Kunden B zuerst zubereitet wird, kann der Kunde A nur auf den Kuchenmeister A warten, um den Kuchen zuzubereiten. Mit anderen Worten, es gibt keine wettbewerbsfähige Beziehung zwischen den Kunden.
Zwei Methoden der Futureedata sollen synchronisiert werden. Es ist keine Rolle, ob der Kuchen fertig ist.
Dies ist überall in diesem Artikel.