Java JUC工具類--Future

  • Future模式,也是非常經典的設計模式,這種模式主要就利用空間換時間的概念,也就是說異步執行(需要開啟一個新的線程)
  • 在互聯網高并發的應用服務中,我們隨處可見這種理念和代碼,主要就是使用了這種模式
  • ?Future模式非常適合在處理耗時很長的業務邏輯時進行使用,可以有效的減小系統的響應時間,提高系統的吞吐量
package com.example.core.juc;import java.util.concurrent.*;public class UseFuture implements Callable<String> {private String param;public UseFuture(String param){this.param = param;}@Overridepublic String call() throws Exception{//模擬執行業務的耗時Thread.sleep(3000);String result = this.param =",處理完成";return result;}public static void main(String[] args) throws InterruptedException, ExecutionException {String queryStr1 = "query1";String queryStr2 = "query2";FutureTask<String> future1 = new FutureTask<String>(new UseFuture(queryStr1));FutureTask<String> future2 = new FutureTask<String>(new UseFuture(queryStr2));ExecutorService executorService = Executors.newFixedThreadPool(2);executorService.submit(future1);//異步的操作executorService.submit(future2);//異步的操作System.out.println("處理其他的任務");Thread.sleep(2000);String ret1 = future1.get();String ret2 = future2.get();System.out.println("數據處理完成"+ret1);System.out.println("數據處理完成"+ret2);
/*
output:
處理其他的任務
數據處理完成,處理完成
數據處理完成,處理完成*/}
}

future設計模式

  • 最為關鍵的就是FutureData包裝類,當客戶端發出請求,FutureData會接收并返回請求,但是此時這個call return并不包含真是的數據,FutureData會發送other call去獲取真實的數據類,再將真實的數據類返回,用于真正的實際使用。

  • Future模式有點類似于商品訂單。 比如在網購時,當看重某一件商品事,就可以提交訂單,當訂單處理完成后,在家里等待商品送貨上門即可
  • ?或者說更形象的我們發送Ajax請求的時候,頁面是異步的進行后臺處理,用戶無須一直等待請求的結果,可以繼續瀏覽或操作其他內容

例子

  • 網購時,當看重某一件商品事,就可以提交訂單,當訂單處理完成后,在家里等待商品送貨上門即可
  • 當客戶端發起請求,返回包裝類對象,另外起一個線程去查詢數據,再將真實的數據返回

  • Main.java
package com.example.core.future;public class Main {public static void main(String[] args) {FutureClient fc = new FutureClient();Data data = fc.request("請求參數");//異步執行System.out.println("做其他的相關業務操作");String rst = data.getRequest();//這才是真正的獲取實際數據的方法System.out.println("---"+rst);}
}
/*
做其他的相關業務操作
根據查詢參數:請求參數進行查詢數據庫操作這可能需要5秒左右的時間
---100條數據*/
  • Data抽象層?
package com.example.core.future;public interface Data {String getRequest();
}
  • FutureClient.java
package com.example.core.future;public class FutureClient {public Data request(final String queryStr){FutureData futureData = new FutureData();//異步的起一個線程去進行相應的處理操作new Thread(new Runnable() {@Overridepublic void run() {//需要把請求的參數 設置到真實數據的處理對象中去RealData realData = new RealData(queryStr);//真實請求處理完成之后,我們需要進行設置,將結果給包裝對象futureData.setRealData(realData);}}).start();;return futureData;}
}
  • FutureData.java
package com.example.core.future;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();}@Overridepublic synchronized  String getRequest() {while(!isReady){try{wait();}catch (InterruptedException e){e.printStackTrace();}}return this.realData.getRequest();}
}
  • RealData.java
package com.example.core.future;public class RealData implements Data{private String result;public RealData(String queryStr){System.out.println("根據查詢參數:"+queryStr+"進行查詢數據庫操作這可能需要5秒左右的時間");try{//時間的查詢耗時Thread.sleep(5000);}catch (InterruptedException e){e.printStackTrace();}result = "100條數據";}@Overridepublic String getRequest() {return result;}
}

?

?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/447300.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/447300.shtml
英文地址,請注明出處:http://en.pswp.cn/news/447300.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

職場與生活 八條原則 讓你不再浪費時間和提高效率

Heidi Roizen女士一度是硅谷人人爭相學習的典范。她曾創辦自己的公司并管理了14年之久。后來&#xff0c;她擔任蘋果公司主管開發者關系的高級副總裁。現在&#xff0c;她是DFJ Venture的一位風投家&#xff0c;她還在斯坦福主講一門名叫??“企業家精神??”的課程。她幾乎認…

Java JUC工具類--Exchanger

Exchanger Exchanger用于進行線程間的數據交換&#xff0c;它提供一個同步點&#xff0c;在這個同步點&#xff0c;兩個線程可以交換彼此的數據兩個線程通過exchange方法交換數據&#xff0c;如果一個線程先執行exchange方法&#xff0c;它會一直等待第二個線程也執行exchang…

爸爸的素質決定孩子飛多高,爸爸們請反復看!!!

好父親等于200個好老師&#xff0c;當爹的都好好看看&#xff0c;以后孩子不給力別怨別人! 孩子是父親的影子&#xff0c;希望每個閱讀完全文的父親&#xff0c;都能成為一個好父親。 NO.1爸爸是孩子最好的老師 爸爸的素質有多高&#xff0c;孩子就能飛多高 用理性的父愛幫…

Java JUC工具類--ForkJoin

ForkJoin Fork/Join框架是JAVA7提供的一個用于并行執行任務的框架&#xff0c;是一個把大任務分割成若干個小任務&#xff0c;最終匯總每個小任務結果后得到大任務結果的框架Fork/Join中兩個重要的類 ForkJoinTask&#xff1a;使用該框架&#xff0c;需要創建一個ForkJoin任務…

修復bug的12個關鍵步驟

要多少時間才能修復bug&#xff0c;事先是很難知道的&#xff0c;特別是如果你和這些代碼還素不相識的話&#xff0c;情況就更加撲朔迷離了。James Shore在《The Art of Agile 》一書中&#xff0c;明確指出要想修復問題得先知道問題的所在。而我們之所以無法準確估計時間是因為…

Java JUC工具類--Master-Worker

Master-Worker Master-Worker模式是常用的并行計算模式。它的核心思想是系統由兩類進程協作工作&#xff1a;Master進程和Worker進程Master負責接收和分配任務&#xff0c;Worker負責處理子任務當各個Worker子進程處理完成后&#xff0c;會將結果返回給Master&#xff0c;由Ma…

身體打來的電話,你一定要接!

心臟有問題時。左邊手臂會酸、麻、痛。肝臟有問題時。小腿晚上睡覺時容易抽筋。腎臟出現問題時。聲音就會出不來&#xff0c;就會沙啞。脾胃出現問題時。偏頭痛。附&#xff1a;五臟排毒最簡單有效的方法 一、心臟有問題時 1。呼吸會不順暢&#xff0c;胸口會悶也會刺痛&…

Java JUC工具類--Semaphore

Semaphore 在Semaphore信號量非常適合高并發訪問限制&#xff0c;新系統在上線之前&#xff0c;要對系統的訪問量進行評估&#xff0c;評估是經過以往的經驗、數據、歷年的訪問量&#xff0c;已經推廣力度進行一個合理的評估當然評估標準不能太大也不能太小&#xff0c;太大的…

python 基礎知識點整理 和具體應用

Python教程 Python是一種簡單易學&#xff0c;功能強大的編程語言。它包括了高效的高級數據結構和簡單而有效的方法&#xff0c;面向對象編程。Python優雅的語法&#xff0c;動態類型&#xff0c;以及它天然的解釋能力&#xff0c;使其成為理想的語言&#xff0c;腳本和應用程序…

Java 線程池相關問題

線程池的拒絕策略 AbortPolicy&#xff1a;直接拋出異常阻止系統正常工作。CallerRunsPolicy&#xff1a;只要線程池未關閉&#xff0c;該策略直接在調用者線程中&#xff0c;運行當前被丟棄的任務。DiscardOldestPolicy&#xff1a;丟棄最老的一個請求&#xff0c;嘗試再次提…

對編程人員我想說:多做 多實踐 多寫代碼

有很多人問我&#xff0c;怎樣提高自己的能力&#xff1f;有初學者&#xff0c;有水平達到一定程度的程序員。 我想說&#xff0c;不要過多的看代碼&#xff0c;看計算機理論&#xff0c;看別人寫的文章&#xff0c;代碼等&#xff0c;最重要的是自己理解了某個原理&#xff0c…

讀人是基礎,看人是關鍵,做人最重要

人生在世&#xff0c;讀人是基礎&#xff0c;看人是關鍵&#xff0c;做人最重要。 一、讀人——一個人就是一本書。讀人&#xff0c;比讀其他文字的書更難。在生活中&#xff0c;每個人都是書&#xff0c;每人又都是讀者。我們認認真真地讀&#xff0c;讀了大半輩子&#xff0c…

使用postman模擬百度通用文字識別

1&#xff0c;登錄百度AI開放平臺 百度AI網站新手指南鏈接在頂部導航欄中&#xff0c;找到控制臺選項&#xff0c;輸入賬號和密碼&#xff0c;進入管理中心頁面在管理中心頁面中&#xff0c;找到文字識別的選項找到創建應用的選項&#xff0c;進行ocr項目的創建需要輸入應用的…

3個觀念 不再瞎學習!

此刻&#xff0c;你應該要做什么準備&#xff1f;加碼股市還是追逐房市&#xff1f;都不是。在你分配時間、資源的投資組合里&#xff0c;有沒有這一項&#xff1a;“自己”&#xff1f; 沒有人會否認充實自我的重要&#xff0c;但是經歷一場金融風暴大震撼&#xff0c;當企業…

Java調用百度OCR文字識別的接口

調用百度OCR文字識別的接口&#xff0c;來自于百度官網&#xff0c;親測可以使用 跳轉鏈接FileUtil的下載鏈接Base64Util下載鏈接HttpUtil下載鏈接GsonUtils下載鏈接Accurate.java文件 package com.baidu.ai.aip;import com.baidu.ai.aip.utils.Base64Util; import com.baidu.…

做好7步 迅速成為行業專家

行行出狀元&#xff0c;但不一定人人能成為行業專家或權威。無論是做獨立顧問&#xff0c;還是手下有250名員工的工廠主管&#xff0c;都是在用自己多年豐富經驗在幫助企業成功。既然有了專業知識和經驗&#xff0c;為什么不把它最大化利用&#xff0c;來建立自己的行業權威&am…

redis常用命令與特性

keys * 返回滿足條件的所有key&#xff0c;可以模糊匹配select 數字0-15&#xff0c;進行數據庫切換&#xff0c;默認0-15個exists 是否存在指定的keypersist 取消過期時間 select 選擇數據庫 &#xff08;0-15&#xff0c;總共16個數據庫&#xff09;move key index 將當前數據…

緊急不代表重要:管理時間的六個秘密

當整個世界都永遠在跟集中精神做事做對的時候&#xff0c;怎么辦&#xff1f;Managershare&#xff1a;“世界上效率最高的程序員有什么相同之處&#xff1f;不是經驗&#xff0c;薪水或者花在一個項目上的時間&#xff0c;而是他們的老板創造了一個免于走神的環境。”這老板太…

redis安全

定期打補丁禁止一些高危命令 &#xff08;flushdb、keys *、flushall&#xff09;以低權限運行 Redis 服務禁止外網訪問 Redis設置訪問密碼 足夠復雜&#xff0c;防止暴力破解 requirepass xxxxxxxx訪問權限 內網通過acl限制可以訪問redis的ip和端口

如何在三個月內獲得三年的工作經驗

在多年的工作生涯中&#xff0c;總會目睹一批人的升職像火箭速度一樣。 而總有一批人&#xff0c;就像蝸牛一樣&#xff0c;工作崗位和職位幾乎從來不變。 我們看看&#xff0c;2個名人的快速成長史。 一個是教英語的李陽&#xff0c;他讀大學時成績不好&#xff0c;英語不…