日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當前位置:首頁 > 科技  > 軟件

Java 異步編程本應更簡單才對

來源: 責編: 時間:2023-12-12 17:00:45 206觀看
導讀在過去的好多年里,多線程和異步一直作為 Java 技術里的高級部分,在技術序列中,一個語言分為入門部分、進階部分和高級部分,所以,異步是作為其中的高級技術部分存在的。關于異步和多線程這部分吧,常常存在于面試題、八股文當

在過去的好多年里,多線程和異步一直作為 Java 技術里的高級部分,在技術序列中,一個語言分為入門部分、進階部分和高級部分,所以,異步是作為其中的高級技術部分存在的。1OK28資訊網——每日最新資訊28at.com

關于異步和多線程這部分吧,常常存在于面試題、八股文當中,但是在大多數的項目代碼中你根本看不著它。神奇嗎,就是這么神奇。1OK28資訊網——每日最新資訊28at.com

糾其原因可能有兩個:1OK28資訊網——每日最新資訊28at.com

  1. 本身大多數項目就很簡單,根本就用不著多線程和異步,畢竟平庸屬于大多數;
  2. Java 中關于多線程和異步的部分確實對于新手不太友好,涉及到的類且多且亂,而且不符合我們正常的思考方式;

我就見過很多同學,多次想入門多線程和異步,但是多次被勸退,或者在大門口反復橫跳。1OK28資訊網——每日最新資訊28at.com

一旁的 Node.js 、Go 憋了一眼:哼,不就會異步嗎,有那么難嗎?1OK28資訊網——每日最新資訊28at.com

在 Java 中實現異步編程有什么方式呢?1OK28資訊網——每日最新資訊28at.com

異步回調函數

最開始寫前端的時候最常用這種回調函數的方法,在 JavaScript 中,函數是一等公民,用法非常靈活。但是在 Java 中,回調方式并不常用。1OK28資訊網——每日最新資訊28at.com

在異步調用結束或者發生異常的時候主動的調用回調方法,以此來達到異步通知的目的。首先定義一個回調接口,如下:1OK28資訊網——每日最新資訊28at.com

public interface ICallBackService {    /**     * 回調方法     * @param args 參數     */    void callback(String ...args) throws InterruptedException;}

然后在你的異步方法中加一個回調參數,參數類型就是上面的 ICallBackService接口類型。1OK28資訊網——每日最新資訊28at.com

public class Work {    /**     * 業務邏輯     * @param callBackService     */    public void doWork(ICallBackService callBackService) throws InterruptedException {        System.out.println("開始回調");        callBackService.callback("第一個參數","第二個參數");        System.out.println("回調結束");    }}

之后在調用端調用doWork方法執行異步調用。1OK28資訊網——每日最新資訊28at.com

public static void main(String[] args) throws InterruptedException {        System.out.println("準備發起異步調用");        Thread thread = new Thread(() -> {            Work work = new Work();            try {                work.doWork(new ICallBackService() {                    @Override                    public void callback(String... args) throws InterruptedException {                        Thread.sleep(1000);                        System.out.printf("正在執行回調動作:%s%n",args==null?"無參數":String.join(",", args));                    }                });            } catch (InterruptedException e) {                throw new RuntimeException(e);            }        });        thread.start();        System.out.println("繼續干其他事兒");    }

執行后,打印的結果,主線程該干什么干什么,異步方法執行后,主動調用回調方法。1OK28資訊網——每日最新資訊28at.com

準備發起異步調用 繼續干其他事兒 異步執行 正在執行回調動作:第一個參數,第二個參數 回調結束1OK28資訊網——每日最新資訊28at.com

回調這種機制有個最要命的問題,它會導致代碼邏輯的割裂,本來是一個從開始到結束的完整執行過程,但是回調方法脫離了代碼主流程,導致我們看代碼的時候產生跳躍感。1OK28資訊網——每日最新資訊28at.com

CompletableFuture 異步

自從 Java 8 出現 Future 之后,異步編程就變得簡單多了,回調函數完全可以不用了。再遇到需要異步的場景時,可以直接祭出 CompletableFuture,CompletableFuture 除了有最基礎的異步調用功能外,還支持異步任務鏈、組合任務等等。1OK28資訊網——每日最新資訊28at.com

異步編程最繁雜的地方就是流程控制,對于 NodeJS 那種天生就是異步的語言來說,有豐富的第三方框架,而對于 Java 來說,到現在都比較少。1OK28資訊網——每日最新資訊28at.com

在不借助第三方框架的情況下,CompletableFuture 應該是最優解了。1OK28資訊網——每日最新資訊28at.com

下面這段代碼展示了異步調用兩個任務,然后將兩個任務的返回結果合并到一起,用到了 CompletableFuture 的組合任務功能。1OK28資訊網——每日最新資訊28at.com

public static void main(String[] args) throws ExecutionException, InterruptedException { //異步發起第一個任務 CompletableFuture<String> firstTask = CompletableFuture.supplyAsync(() -> {    try {     Thread.sleep(1000);    } catch (InterruptedException e) {     throw new RuntimeException(e);    }    return "第一個任務的結果";   } ); //異步發起第二個任務 CompletableFuture<String> secondTask = CompletableFuture.supplyAsync(() -> "第二個任務的結果"); // 合并兩個任務的結果 CompletableFuture<String> combineTask = firstTask.thenCombineAsync(secondTask, (firstResult, secondResult) -> {  return firstResult + "&&" + secondResult; }); combineTask.thenAccept((result) -> {  System.out.println("最終結果:" + result); }); System.out.println("其他任務,該干嘛干嘛"); combineTask.join();}}

Reactor 響應式編程

用過 Spring Boot 的同學一定看到過 webFlux 這個東西,其實它就是 Reactor 中的功能。Reactor 的核心包是 reactor-core ,專為異步編程而生,已經是 Spring Boot 的內置框架了。1OK28資訊網——每日最新資訊28at.com

Reactor 是一個完全非阻塞的JVM響應式編程框架。響應式編程是一種涉及數據流和變化傳播的異步編程范式。這意味著可以通過編程語言輕松地表示靜態(如數組)或動態(如事件發射器)數據流。1OK28資訊網——每日最新資訊28at.com

事件發射器可以理解為事件驅動,如果做過 GUI 或客戶端開發的肯定對事件驅動非常熟悉,事件驅動其實就是順著人的思考模式來的,進行什么操作就觸發什么事件。1OK28資訊網——每日最新資訊28at.com

下面是用 Reactor 實現的一個簡單異步任務,其中subscribe 方法可以理解為一個事件訂閱器,在里面可以訂閱 onNext (也就是正常執行)、onError (發生錯誤是執行)以及onComplete(執行完成)等事件。每命中一個事件,就可以驅動這個事件做一些事情。1OK28資訊網——每日最新資訊28at.com

就是以順序寫代碼的方式,實現異步的邏輯。1OK28資訊網——每日最新資訊28at.com

public static void main(String[] args) { Mono<String> asyncTask = Mono.fromCallable(() -> {  // 模擬異步操作  Thread.sleep(1000);  // 返回結果  return "任務執行成功"; }); // 訂閱事件 asyncTask.subscribe(   result -> {    // onNext 事件,處理任務成功的情況    System.out.println("任務成功,結果:" + result);   },   error -> {    // onError 事件,處理任務出錯的情況    System.err.println("任務出錯:" + error.getMessage());   },   () -> {    // onComplete 事件,處理任務完成的情況    System.out.println("任務完成");   } ); // 使用 block 方法等待異步任務完成 String result = asyncTask.block(); System.out.println("主線程等待結果:" + result);}

執行以上代碼前,需要引入 reactor-core 依賴包。1OK28資訊網——每日最新資訊28at.com

<dependency>  <groupId>io.projectreactor</groupId>  <artifactId>reactor-core</artifactId>  <version>3.6.0</version></dependency>

與 Reactor 類似的還有 RxJava,在 Android 開發上用的最多。1OK28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-43291-0.htmlJava 異步編程本應更簡單才對

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: SpringBoot與CQRS的完美結合:構建高效、可擴展的應用程序

下一篇: 使用Linux命令行傳遞環境變量給Docker容器

標簽:
  • 熱門焦點
  • 7月安卓手機好評榜:三星S23Ultra好評率第一

    性能榜和性價比榜之后,我們來看最后的安卓手機好評榜,數據來源安兔兔評測,收集時間2023年7月1日至7月31日,僅限國內市場。第一名:三星Galaxy S23 Ultra好評率:95.71%在即將迎來新
  • 使用LLM插件從命令行訪問Llama 2

    最近的一個大新聞是Meta AI推出了新的開源授權的大型語言模型Llama 2。這是一項非常重要的進展:Llama 2可免費用于研究和商業用途。(幾小時前,swyy發現它已從LLaMA 2更名為Lla
  • 虛擬鍵盤 API 的妙用

    你是否在遇到過這樣的問題:移動設備上有一個固定元素,當激活虛擬鍵盤時,該元素被隱藏在了鍵盤下方?多年來,這一直是 Web 上的默認行為,在本文中,我們將探討這個問題、為什么會發生
  • 破圈是B站頭上的緊箍咒

    來源 | 光子星球撰文 | 吳坤諺編輯 | 吳先之每年的暑期檔都少不了瞄準追劇女孩們的古偶劇集,2021年有優酷的《山河令》,2022年有愛奇藝的《蒼蘭訣》,今年卻輪到小破站抓住了追
  • 本地生活這塊肥肉,拼多多也想吃一口

    出品/壹覽商業 作者/李彥編輯/木魚拼多多也看上本地生活這塊蛋糕了。近期,拼多多在App首頁&ldquo;充值中心&rdquo;入口上線了本機生活界面。壹覽商業發現,該界面目前主要
  • 蘋果、三星、惠普等暫停向印度出口筆記本和平板電腦

    集微網消息,據彭博社報道,在8月3日印度突然禁止在沒有許可證的情況下向印度進口電腦/平板及顯示器等產品后,蘋果、三星電子和惠普等大公司暫停向印度
  • 質感不錯!OPPO K11渲染圖曝光:旗艦IMX890傳感器首次下放

    一直以來,OPPO K系列機型都保持著較為均衡的產品體驗,歷來都是2K價位的明星機型,去年推出的OPPO K10和OPPO K10 Pro兩款機型憑借各自的出色配置,堪稱有
  • 朋友圈可以修改可見范圍了 蘋果用戶可率先體驗

    近日,iOS用戶迎來微信8.0.27正式版更新,除了可更換二維碼背景外,還新增了多項實用功能。在新版微信中,朋友圈終于可以修改可見范圍,簡單來說就是已發布的朋友圈
  • 蘋果MacBook Pro 2021測試:仍不支持平滑滾動

    據10月30日9to5 Mac 消息報道,蘋果新的 14 英寸和 16 英寸 MacBook Pro 2021 上市后獲得了不錯的評價,亮點包括行業領先的性能,令人印象深刻的電池續航,精美豐
Top 主站蜘蛛池模板: 博客| 庐江县| 称多县| 河曲县| 丹寨县| 紫阳县| 罗江县| 松溪县| 城固县| 连云港市| 桐柏县| 河间市| 互助| 九江市| 桐梓县| 冀州市| 宝应县| 麻城市| 临城县| 青川县| 临邑县| 利津县| 北碚区| 定陶县| 哈尔滨市| 凤阳县| 石泉县| 泸溪县| 泸州市| 溧水县| 资阳市| 分宜县| 鹤庆县| 民权县| 麟游县| 开封县| 富顺县| 富民县| 海宁市| 马山县| 青州市|