Na plataforma Java, as funções que implementam chamadas assíncronas têm as três funções a seguir: os dados reais do chamador na lei de embarque
Quando um chamador chama operação demorada e não pode retornar os dados imediatamente, ele retornará primeiro um conhecimento de embarque.
Vá para a loja de bolos para comprar bolos, você não precisa esperar o bolo ser feito (assumindo que leva muito tempo para fazê -lo), você só precisa obter um conhecimento de embarque (vá fazer outra coisa) Quando o bolo está pronto, você pode obter a nota de embarcar no bolo está bem.
classe pública principal {public static void main (string [] args) {System.out.println ("principal iniciante"); Data2 = host.request (20, 'B'); Catch (InterruptedException e) {} System.out.println ("Principal OtherJob End"); Data2 .getContent ());
A classe principal aqui é equivalente a "Cliente" e o host é equivalente a "Bolo Shop". é equivalente a pegar as mercadorias. Após um período de tempo (depois de dormir por um período de tempo), ligue para Data1.getContent (), o que significa obter a conta de embarque para obter o resultado da execução.
Vamos dar uma olhada no que a loja de bolos fez depois que o cliente encomendou o bolo:
public class Host {Public Data Solicy (contagem final int, char final C) {System.out.println ("request (" + count + "," + c + ") BEGIN"); Entidade final futureata futuro = new Futuredata (); classe interna. RealData RealData = novo RealData (contagem, C); // (3) Recupere a entidade Futuredata como o valor de retorno retorno futuro;
Depois de receber o pedido, o host ("bolos") se tornou um futuro de "livro de embarque" Futuredata e, em seguida, ordenou que o "Cake Maker" RealData para fazer o bolo. . Então, o que o anfitrião retorna ao cliente é apenas o futuro "Livro de embarque", não o bolo. Depois que o bolo terminar, o fabricante de bolos pode dar o bolo "Livro de embarque" correspondente, ou seja, Future.SetRealData (RealData).
Vamos dar uma olhada em como o fabricante de bolos faz bolos:
Crie uma string contendo caracteres C Count C.
classe pública RealData implementa dados {private Final String Content; Buffer = novo Char [Count]; .println ("Fazendo o RealData (" Count + "," C + ");
Agora, vamos dar uma olhada em como o futuro da "lei de embarque" corresponde ao "conteúdo" do bolo:
classe pública FuturedATATA Data {private RealData RealData = NULL; } this.realdata = realdata; ();
Depois que o cliente terminar seu próprio negócio, ele levará seu próprio "Livro de Lading" para pegar o bolo:
System.out.println ("data1 =" + data1.getContent ());
Se o bolo não estiver pronto, você terá que esperar:
while (! Ready) {tente {wait ();
Análise do programa
Para cada solicitação, o host gerará um thread, responsável por gerar o "bolo" necessário para o cliente. Depois de esperar um pouco, se o bolo não estiver pronto, os clientes devem esperar. O cliente só pode tirar o bolo até que o "bolo seja feito", isto é, futuro.SetRealData (RealData);
Cada encadeamento é apenas responsável por fazer o "bolo" que um cliente específico precisa. Ou seja, o cliente A corresponde ao Bolo Master A, e o Cliente B corresponde ao Cake Master B. Mesmo que o bolo do cliente B seja preparado primeiro, o cliente A só pode esperar pelo mestre do bolo a preparar o bolo. Em outras palavras, não há relacionamento competitivo entre os clientes.
Dois métodos de Futuredata são definidos como sincronizados. importa se o bolo está pronto.
Isso está em todo o artigo.