Em um aplicativo único, quando você chama um método, o resultado será retornado apenas quando o cálculo terminar.
Public String DownloadContents (URL URL) lança IoException {TRYSTREAM INPUT = url.openstream ()) {return ioutils.tring (input, standardc harsets.utf_8);}} // ... Final Future <strong> conteúdo = Download (novo url ("http://www.example.com");
DownloadContents () parece inofensivo, mas precisa ser feito por um longo tempo. Ao mesmo tempo, para reduzir o atraso, durante o resultado da espera, pode ser necessário lidar com outro trabalho de forma independente ao mesmo tempo. No passado, você pode iniciar um novo thread ou aguardar os resultados (compartilhando memória, bloqueio, espera ruim ()/notify ()).
Através do modo futuro <t>, ele ficará claro:
Public static futuro <string> startdownloading (url url) {// ...} FUTURO FINAL <STING> CONTENTSFUTURE = startDownload (novo, http: //www.example .com "); // Outros string de computaçãoFinal String Contents = contentfuture .pegar ();
Realizaremos o StartDownloading (), StartDownloading () não será bloqueado, mas aguardando os sites externos para responder. Pelo contrário, se ele retornar rapidamente e retornar um futuro leve <String> objeto. Este objeto é uma promessa, portanto, o tipo de string futuro está disponível. Em outras palavras, o Future é um agente ou uma embalagem de objeto, não um objeto de destino real. Depois que o cálculo assíncrono é concluído, você pode extraí -lo. Então, que tipo de interface o futuro fornece?
Futuro.get () é o método mais importante. Ele bloqueia e aguarda até que o resultado da promessa esteja disponível; portanto, se realmente precisarmos dessa string, ligue para o método get () e aguarde. Há também uma versão de carga pesada que aceita parâmetros de tempo limite.
Em alguns casos, convém secretamente se o futuro está disponível. Isso pode ser feito através do ISDONE (). Imagine uma situação, seu usuário está aguardando alguns cálculos assíncronos.
FUTURO FINAL <STRING> contentsfuture = startDownloading (new URL ("http://www.example.com"); while (! ;;
Finalmente, é garantido que o conteúdo do futuro.get () retorne imediatamente sem ser bloqueado, porque o futuro.isdone () retorna true. Se você seguir este modelo, não estará ocupado esperando e chamando Isdone () alternadamente a cada segundo.
Cancelar Futrues é o último que não abordamos. Imagine que você inicie o trabalho assíncrono e só pode esperar algum tempo. No entanto, você é um bom cidadão, deve dizer a este objeto futuro: não preciso mais de você, você não se importa. Em seguida, você pode economizar recursos interrompendo as tarefas desatualizadas. A gramática é simples:
Contentsfuture.cancel (true);
Todos nós gostamos de esconder, parâmetros do tipo Boer, certo? O cancelamento pode ser implementado de duas maneiras: antes do início da tarefa, o parâmetro falso é cancelado, desde que antes dos resultados do futuro expressem, o cálculo inicia. Depois que o Callable.Call () está sendo executado para a metade, queremos que ele termine. Você acha que isso é bom? Fenômenos aqueles que lançam interrupções de exceção, o método infame, como thread.sleep (), object.wait (), Conition.await (), etc., mesmo se você estiver bloqueado neste método e algumas pessoas decidem cancelar sua chamada , sem dúvida, eles lançarão a interrupção e enviarão alguém para interromper a tarefa de operação atual.
Então agora entendemos o que é o futuro-um espaço reservado, você pode obter o objeto de destino no futuro. Assim como um carro, não há chave para fabricar. Mas como você pode obter uma instância do futuro no aplicativo? Os dois recursos mais comuns são pools de threads e métodos assíncronos (suporte ao pool de threads). Portanto, o método startDownloading () pode ser reescrito como:
Pool de executores de executores final = executores.newfixedthreadpool (10); InputStream input = url.openstream ()) {return ioutils.toString (entrada, standardcharsets.utf_8);}});}
Embora existam muitos problemas gramaticais tediosos, o pensamento básico é simples: a computação de embalagem que precisa estar em execução por um longo tempo é embalada para o <String> ajustável e submeter () para o pool de threads. tópicos. Após o envio, a implementação do futuro <tring> é como vincular à sua tarefa e pool de threads de alguma forma. Obviamente, sua tarefa não será executada imediatamente. A tarefa de permanecer no meio também pode cancelar a tarefa que há muito tempo está em execução, mas isso é uma coisa mais complicada.
Você também pode encontrar o futuro na primavera e no EJB. Por exemplo, você pode adicionar a anotação de @async à estrutura da primavera:
@Asyncpublic futuro <string> startdownloading (URL final URL) lança ioexception {try (inputStream input = url.openstream ()) {retorna novos asyncres ult <>
Observe que simplesmente implementamos o resultado futuro através do resultado da embalagem para assíncronos, mas esse método em si não interagirá com o pool de threads ou assíncrono processado. A primavera mais tarde representará todas as chamadas para o StartDownloading () e executará no pool de threads. No EJB, o mesmo recurso é concluído adicionando @asynchronsannotation.