摘要:模式類似于用戶提交商品訂單,下單成功以后后臺(tái)異步的執(zhí)行耗時(shí)的業(yè)務(wù)在包中接口是線程模式的實(shí)現(xiàn),可以來(lái)進(jìn)行異步計(jì)算。
Future模式
類似于用戶提交商品訂單,下單成功以后后臺(tái)異步的執(zhí)行耗時(shí)的業(yè)務(wù)
在java.util.concurrent包中.Future接口是Java線程Future模式的實(shí)現(xiàn),可以來(lái)進(jìn)行異步計(jì)算。
1.定義一個(gè)接口來(lái)處理請(qǐng)求
public interface Data{ String getRequest(); }
2.定義一個(gè)轉(zhuǎn)發(fā)請(qǐng)求的客戶端
public class FutureClient{ public Data request(final String queryStr){ //1.添加一個(gè)代理對(duì)象(Data接口的實(shí)現(xiàn)類) 先返回給發(fā)送請(qǐng)求的客戶端 //告訴客戶端收到請(qǐng)求,可以處理其他事情 final FutureData futureData = new FutureData(); //2.啟動(dòng)一個(gè)新的線程 去加載真實(shí)的數(shù)據(jù) 傳遞給這個(gè)代理對(duì)象 new Thread(new Runnable(){ public void run(){ //3這個(gè)新的線程可以去慢慢的加載真實(shí)對(duì)象 //然后傳遞給代理對(duì)象 RealData realData = new RealData(queryStr); futureData.setRealData(realData); } }).start(); return futureData; } }
3.定義一個(gè)代理類來(lái)返回?cái)?shù)據(jù)
public class FutureData implements Data{ private RealData realData; private boolean isReady = false; public void synchronized void setRealData(RealData realData){ //如果已經(jīng)轉(zhuǎn)載完畢 直接返回 if(iReady){ return; } //如果沒(méi)有裝載,進(jìn)行裝載真實(shí)對(duì)象 this.realData = realData; isReady = true; //進(jìn)行通知 notify(); } public synchronized String getRequest(){ //如果沒(méi)有裝載好 程序就一直處于阻塞的狀態(tài) while(!isReady){ try { wait(); } catch (InterruptedException e) { e.printStackTrace(); } } //裝載好直接獲取數(shù)據(jù)即可 return this.realData.getRequest(); } }
4.定義一個(gè)處理大量耗時(shí)操作的類
public class RealData implements Data{ private String result; public RealData(String queryStr){ System.out.println("根據(jù)" + queryStr + "進(jìn)行查詢, 這是一個(gè)很耗時(shí)的操作.."); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } System.out.println("操作完畢,獲取結(jié)果"); result = "查詢結(jié)果"; } public String getRequest(){ retun result; } }
5.定義一個(gè)測(cè)試類
public class Main{ public static void main(String[] args) throws InterruptedException { FutureClient fc = new FutureClient(); Data data = fc.request("發(fā)送請(qǐng)求"); System.out.println("請(qǐng)求發(fā)送成功!"); System.out.println("做其他的事情..."); String result = data.getRequest(); System.out.println(result); } }
結(jié)果如下
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/70425.html
摘要:模式是常用的并行計(jì)算模式,它的核心思想是系統(tǒng)是由兩類進(jìn)程協(xié)助工作。負(fù)責(zé)接收和分配任務(wù),負(fù)責(zé)處理子任務(wù)。當(dāng)各個(gè)子進(jìn)程處理完成后,會(huì)返回結(jié)果給,由做歸納和總結(jié)。其好處是能將一個(gè)大任務(wù)分解成若干個(gè)小任務(wù),并行執(zhí)行,從而提高系統(tǒng)的吞吐量。 Master-worker模式是常用的并行計(jì)算模式,它的核心思想是系統(tǒng)是由兩類進(jìn)程協(xié)助工作。Master負(fù)責(zé)接收和分配任務(wù),worker負(fù)責(zé)處理子任務(wù)。當(dāng)各...
摘要:生產(chǎn)者消費(fèi)者模式是一個(gè)經(jīng)典的多線程設(shè)計(jì)模式,它為多線程的協(xié)作提供了良好的解決方案。生產(chǎn)者消費(fèi)者模式中的內(nèi)存緩沖區(qū)的主要功能是數(shù)據(jù)在多線程間的共享。 生產(chǎn)者-消費(fèi)者模式是一個(gè)經(jīng)典的多線程設(shè)計(jì)模式,它為多線程的協(xié)作提供了良好的解決方案。在生產(chǎn)者-消費(fèi)者模式中,通常有兩類線程,即若干個(gè)生產(chǎn)者線程和若干個(gè)消費(fèi)者線程。生產(chǎn)者線程負(fù)責(zé)提交用戶請(qǐng)求,消費(fèi)者線程負(fù)責(zé)處理用戶請(qǐng)求。生產(chǎn)者和消費(fèi)者之間通過(guò)...
摘要:并發(fā)表示在一段時(shí)間內(nèi)有多個(gè)動(dòng)作存在。并發(fā)帶來(lái)的問(wèn)題在享受并發(fā)編程帶來(lái)的高性能高吞吐量的同時(shí),也會(huì)因?yàn)椴l(fā)編程帶來(lái)一些意想不到弊端。并發(fā)過(guò)程中多線程之間的切換調(diào)度,上下文的保存恢復(fù)等都會(huì)帶來(lái)額外的線程切換開(kāi)銷。 0x01 什么是并發(fā) 要理解并發(fā)首選我們來(lái)區(qū)分下并發(fā)和并行的概念。 并發(fā):表示在一段時(shí)間內(nèi)有多個(gè)動(dòng)作存在。 并行:表示在同一時(shí)間點(diǎn)有多個(gè)動(dòng)作同時(shí)存在。 例如:此刻我正在寫博客,但...
摘要:并行流與目前,我們對(duì)集合進(jìn)行計(jì)算有兩種方式并行流而更加的靈活,我們可以配置線程池的大小確保整體的計(jì)算不會(huì)因?yàn)榈却l(fā)生阻塞。 【回顧Future接口 Future接口時(shí)java5引入的,設(shè)計(jì)初衷是對(duì)將來(lái)某個(gè)時(shí)刻會(huì)發(fā)生的結(jié)果建模。它建模了一種異步計(jì)算,返回了一個(gè)執(zhí)行預(yù)算結(jié)果的引用。比如,你去干洗店洗衣服,店員會(huì)告訴你什么時(shí)候可以來(lái)取衣服,而不是讓你一直在干洗店等待。要使用Future只需...
摘要:本文介紹和點(diǎn)評(píng)上的等并發(fā)編程模型。異步更適合并發(fā)編程。同步使線程阻塞,導(dǎo)致等待?;灸P瓦@是最簡(jiǎn)單的模型,創(chuàng)建線程來(lái)執(zhí)行一個(gè)任務(wù),完畢后銷毀線程。響應(yīng)式編程是一種面向數(shù)據(jù)流和變化傳播的編程模式。起源于電信領(lǐng)域的的編程模型。 本文介紹和點(diǎn)評(píng)JVM上的Thread, Thread Pool, Future, Rx, async-await, Fiber, Actor等并發(fā)編程模型。本人經(jīng)驗(yàn)...
閱讀 2337·2021-11-24 10:18
閱讀 3422·2021-09-22 15:35
閱讀 3362·2021-09-13 10:37
閱讀 3782·2021-09-06 15:14
閱讀 2087·2021-09-06 15:02
閱讀 2235·2021-09-02 15:11
閱讀 561·2019-08-30 15:53
閱讀 3087·2019-08-29 16:15