摘要:模式是多線程開發中非常常見的一種設計模式,它的核心思想是異步調用。這類似我們日常生活中的在線購物流程,帶在購物網看著一件商品時可以提交表單,當訂單完成后就可以在家里等待商品送貨上門。內部類已經實現了模式,后續再講
Future模式是多線程開發中非常常見的一種設計模式,它的核心思想是異步調用。這類似我們日常生活中的在線購物流程,帶在購物網看著一件商品時可以提交表單,當訂單完成后就可以在家里等待商品送貨上門?;蛘哒f更形象的是我們發送Ajax請求的時候,頁面是異步的進行后臺處理,用戶無需等待請求的結果,可以繼續瀏覽或操作其他內容。
如上圖所示,客戶端調用購物請求,服務端程序不等數據處理完成便立即返回客戶端一個偽造的數據,(相當于訂單,而不是真實的商品)這時候由服務端自己偷偷摸摸的發送了一個other call()請求去獲取真實的商品(打包,出庫,送貨)。這就是Future模式的核心所在。
Future模式的主要角色有:
Main:系統啟動,調用FutureClient發出請求
FutureClient:返回Data對象,立即返回FutureData,并開啟線程去獲取RealData
Data:返回數據的接口
FutureData:虛擬數據,返回很快,需要裝載RealData
RealData:真實數據
我們來看代碼:
Main:
public class Main { public static void main(String[] args) { FutureClient fc = new FutureClient(); Data data = fc.getRequset("jianzh5"); System.out.println("請求完畢..."); String result = data.getRequest(); System.out.println("返回的結果:"+result); } }
此類主要調用FutureClient的getRequset方法去返回數據
FutureClient:
public class FutureClient { public Data getRequset(final String queryStr){ //初始化代理對象,先返回給客戶端 final FutureData futureData = new FutureData(); //啟動一個新的線程去加載真實的數據,傳遞給這個代理對象 new Thread(new Runnable() { @Override public void run() { //此線程去加載真實對象,然后傳遞給代理對象 RealData realData = new RealData(queryStr); futureData.setRealData(realData); } }).start(); System.out.println("代理對象返回:"+futureData); return futureData; } }
該類在接受到用戶請求后很快就能返回虛擬數據 futureData,本身啟動一個線程去獲取真實數據
RealData:
public class RealData implements Data{ private String result; public RealData(String queryStr){ System.out.println("根據參數: "+queryStr+" 進行查詢,這是一個很耗時的操作!"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("裝載完畢,獲取結果"); result = "查詢結果"; } @Override public String getRequest() { return result; } }
RealData裝載數據較慢,這里使用Sleep(5000)模擬復雜業務邏輯。
FutureData:
public class FutureData implements Data{ private RealData realData; private boolean isReady = false; public synchronized void setRealData(RealData realData){ //如果已經裝載完畢則直接返回 if(isReady){ return; } //如果未裝載,進行裝載真實數據 this.realData = realData; isReady = true; //通知 notify(); } @Override public synchronized String getRequest() { //如果未裝載好一直處于阻塞狀態 while (!isReady){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //裝載好直接返回數據即可 return this.realData.getRequest(); } }
該類是Future模式的關鍵,它實際是真實數據RealData的代理,封裝了獲取RealData的等待過程實際返回的是真實的數據。
JDK內部類已經實現了Future模式,后續再講!
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/69145.html
摘要:本文首發于一世流云的專欄一模式簡介模式是多線程設計模式中的一種常見模式,它的主要作用就是異步地執行任務,并在需要的時候獲取結果。二中的模式在多線程基礎之模式中,我們曾經給出過模式的通用類關系圖。 showImg(https://segmentfault.com/img/bVbiwcx?w=1000&h=667); 本文首發于一世流云的專欄:https://segmentfault.co...
摘要:一定義模式用來獲取線程的執行結果。案例中的類就是參與者參與者接受請求,然后創建線程進行異步處理。參與者會立即返回以的形式。虛擬數據參與者是用來統一代表參與者與參與者。 一、定義 Future模式用來獲取線程的執行結果。在Thread-Per-Message模式中,如果調用一個線程異步執行任務,沒有辦法獲取到返回值,就像:host.request(10,A);而Future模式送出請求后...
摘要:事件循環是異步編程的底層基石。對事件集合進行輪詢,調用回調函數等一輪事件循環結束,循環往復。協程直接利用代碼的執行位置來表示狀態,而回調則是維護了一堆數據結構來處理狀態。時代的協程技術主要是,另一個比較小眾。 Coding Crush Python開發工程師 主要負責豈安科技業務風險情報系統redq。 引言 1.1. 存儲器山 存儲器山是 Randal Bryant 在《深入...
摘要:的多任務執行框架提供了一套線程框架來幫助開發者有效的進行線程控制,扮演線程工廠的角色,其創建線程的方法如下返回固定數量的線程池,該方法的線程數始終不變。 1.Jdk的多任務執行框架 JDK提供了一套線程框架Executor來幫助開發者有效的進行線程控制,Executors扮演線程工廠的角色,其創建線程的方法如下 newFixedThreadPool() 返回固定數量的線程池,該方法的...
摘要:是一個倡議,它提倡提供一種帶有非阻塞背壓的異步流處理的標準。是標準的實現之一。的實現細節請求響應的與請求響應的暴露為是請求的的消費者是響應的的生產者內部的內部 北京時間 9 月 26 日,Oracle 官方宣布 Java 11 正式發布 一、JDK HTTP Client介紹 JDK11中的17個新特性 showImg(https://segmentfault.com/img/remo...
閱讀 2307·2023-04-25 14:17
閱讀 1515·2021-11-23 10:02
閱讀 2170·2021-11-23 09:51
閱讀 873·2021-10-14 09:49
閱讀 3384·2021-10-11 10:57
閱讀 2921·2021-09-24 09:47
閱讀 3046·2021-08-24 10:00
閱讀 2298·2019-08-29 18:46