future promise java_第四章 Future和Promise

Netty是一個異步網絡處理框架,在實現中大量使用了Future機制,并在Java自帶Future的基礎上,增加了Promise機制。這兩者的目的都是使異步編程更加方便使用。在閱讀源碼之前,我們需要對Future的機制有很清楚的認識。

## 4.1 異步編程模型

### 4.1.1 Future

使用Future機制時,我們調用耗時任務會立刻返回一個Future實例,使用該實例能夠以阻塞的方式或者在未來某刻獲得耗時任務的執行結果,還可以添加監聽事件設置后續程序。

```

function Future asynchronousFunction(String arg){

Future future = new Future(new Callable(){

public Object call(){

return null;

}

});

return future;

}

ReturnHandler handler = asynchronousFunction(); // 耗時函數,但會立即返回一個句柄

handler.getResult(); // 通過句柄可以等待結果

handler.addListener(); //通過句柄可以添加完成后執行的事件

handler.cancel(); // 通過句柄取消耗時任務

```

### 4.1.2 Promise

在Future機制中,業務邏輯所在任務執行的狀態(成功或失敗)是在Future中實現的,而在Promise中,可以在業務邏輯控制任務的執行結果,相比Future,更加靈活。

```

// 異步的耗時任務接收一個promise

function Promise asynchronousFunction(String arg){

Promise promise = new PromiseImpl();

Object result = null;

result = search() //業務邏輯,

if(success){

promise.setSuccess(result); // 通知promise當前異步任務成功了,并傳入結果

}else if(failed){

promise.setFailure(reason); 通知promise當前異步任務失敗了

}else if(error){

promise.setFailure(error); 通知promise當前異步任務發生了異常

}

}

// 調用異步的耗時任務

Promise promise = asynchronousFunction(promise) ;//會立即返回promise

//添加成功處理/失敗處理/異常處理等事件

promise.addListener();// 例如,可以添加成功后執行的事件

doOtherThings() ; // 繼續做其他事件,不需要理會asynchronousFunction何時結束

```

在Netty中,Promise繼承了Future,包含了這兩者的功能。

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

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

相關文章

在頁面最上面顯示當前登陸的狀態

首先先判斷一下session <li> <?php if(session(m_id)) : ?> 您好, <?php echo session(m_username); ?>[<a href"<?php echo U(Member/logout) ; ?>">退出</a>] <?php else : ?> 您好&#xff0c;歡迎來到京西&a…

python入門之運算符的使用的答案_python入門教程之基本算術運算符

一、算術運算符運算符-*/%**(冪)求次方//(取整除&#xff0c;向下取整)如&#xff1a;9//2 4二、比較運算符運算符!<>(不等于&#xff0c;類似&#xff01;)<>><#舉例說明&#xff1a;x 10y 20print(x > y) # Falseprint(x < y) # Trueprint(x > …

JVM體系結構

JVM體系結構 Java虛擬機主要分為五大模塊&#xff1a; 類裝載器子系統運行時數據區執行引擎本地方法接口垃圾收集模塊1、JVM一共分為五個區&#xff0c;分別為方法區、堆、Java棧、本地方法棧、程序計 2、方法區、堆為線程共享區域&#xff0c;GC會對二個區進行垃圾回收&…

找數據?這幾個數據源網站就夠用了?

來源&#xff1a;經管學苑轉自&#xff1a;經管學苑大家好&#xff0c;我是小z在這個用數據說話的時代&#xff0c;能夠打動人的往往是用數據說話的理性分析&#xff0c;無論是對于混跡職場的小年輕&#xff0c;還是需要數據進行分析和研究的同學&#xff0c;能夠找到合適的數據…

solaris11-text-安裝GUI(gnome)

http://blog.chinaunix.net/xmlrpc.php?rblog/article&uid45057&id3018467 1.下載所需的資源Text Installer CDRepository Image(a,b)http://www.oracle.com/technetwork/server-storage/solaris11/downloads/index.html2.用text CD安裝solaris11安裝那是相當的快呀&a…

java replaceall 大小寫_Java replaceAll不區分大小寫

Java 中replaceAll如何忽略大小寫呢?方式一:在正則表達式前面添加(?i)Testpublic void test_replaceAll33(){String input "I like Java,jAva is very easy and jaVa is so popular.";String replacement"cccc";System.out.println(input);System.out.p…

jdk環境變量配置_jmeter及jdk的環境變量配置

jmeter是apache公司基于java開發的一款開源壓力測試工具&#xff0c;其內部原理都是源于java的運行&#xff0c;并支持多種外部插件用于接口及性能測試&#xff0c;最主要的還是開源免費&#xff0c;在安裝jmeter前必須配置jdk環境。jdk下載地址&#xff1a;https://www.oracle…

jvm是運行在操作系統之上的,他和硬件沒有直接的交互

jvm是運行在操作系統之上的&#xff0c;他和硬件沒有直接的交互

SQL語言基礎:觸發器相關知識介紹?

1、觸發器 Trigger介紹觸發器可以實現完整性規則和保證一些復雜業務規則的實施。針對示警或滿足特定 條件下自動執行某項任務來說&#xff0c;觸發器是十分有用的機制。觸發器是由事件1驅動的特殊過程&#xff0c;一旦由某個用戶定義&#xff0c;任何用戶對該觸發器指定的數據新…

socket與socketServer通信

服務端代碼&#xff1a; public class TalkServer {public static void main(String args[]){try {//創建服務器&#xff0c;開放7777端口ServerSocket server new ServerSocket(7777);while(true){Socket socket server.accept();System.out.println("客戶端與服務端已…

java struts2值棧ognl_Struts2的值棧和OGNL牛逼啊

Struts2的值棧和OGNL牛逼啊一 值棧簡介&#xff1a;值棧是對應每個請求對象的一套內存數據的封裝&#xff0c;Struts2會給每個請求創建一個新的值棧&#xff0c;值棧能夠線程安全的為每個請求提供公共的數據存取服務。二 OGNL介紹&#xff1a;(1)基本數據&#xff1a;OGNL 是對…

還在用 Notepad++嗎? 盤點五款更好用的文本編輯器

來自&#xff1a;oschina.net/news/110987/no-notepad-plus-plus | 責編&#xff1a;樂樂正文 Notepad 一直飽受爭議&#xff0c;2018年開始然后引發了大家的關注&#xff0c;這里師長作為技術媒體&#xff0c;不方便帶啥節奏&#xff0c;具體事件內容請大家自行百度。其實作…

python3列表_Python3 列表List(十一)

list是一種有序可重復的集合&#xff0c;可以隨時添加和刪除其中的元素。序列是Python中最基本的數據結構。序列中的每個元素都分配一個數字 - 它的位置&#xff0c;或索引&#xff0c;第一個索引是0&#xff0c;第二個索引是1&#xff0c;依此類推。Python有6個序列的內置類型…

ubuntu14.04 boost動態庫找不到 libboost_system.so.1.58.0

error while loading shared libraries: : cannot open shared object file: No such file or directory 解決辦法&#xff1a;向ld.so.conf文件中添加libboost_system.so.1.58.0所在的目錄路徑sudo vim /etc/ld.so.conf sudo ldconfig http://blog.csdn.net/smallfish0315/ar…

SQL語言:嵌入式SQL知識筆記

1、概念SQL提供了將SQL語句嵌入到某種高級語言中的使用方式&#xff0c;通常采用預編譯的方法將SQL語句嵌入高級語言中。采用的方法由DBMS的預處理程序對源程序進行掃碼、識別出SQL語句&#xff0c;把它們轉換為主語言調用語句&#xff0c;這樣可以讓主語言編譯程序能識別它&am…

Mysql bat腳本編寫_第一次編寫bat腳本

** 前言 **今天中午在宿舍不想做什么事&#xff0c;于是想到傻怡的電腦太卡了&#xff0c;多方面原因造成的&#xff0c;多軟件安裝于系統盤、安裝了沒用的殺毒軟件等等&#xff0c;但是對于windows系統來說呢&#xff0c;使用時間長了&#xff0c;會有很多的緩存文件、日志文件…

python 關閉窗口事件_關于python:如何在Tkinter中處理窗口關閉事件?

如何在Python Tkinter程序中處理窗口關閉事件(用戶單擊" X"按鈕)&#xff1f;Tkinter支持一種稱為協議處理程序的機制。在這里&#xff0c;術語協議是指應用程序和窗口管理器之間的交互。最常用的協議稱為WM_DELETE_WINDOW&#xff0c;用于定義當用戶使用窗口管理器顯…

windows+caffe(三)——求取圖片的均值

這個要在圖片已經轉化成lmdb格式下才能求均值。。。 1.查看caffe根目錄下的bin是否存在compute_image_mean.exe&#xff08;用的happey大神的&#xff09; 如果沒有存在&#xff0c;你需要打開MainBuilder.sln&#xff0c;右鍵compute_image_mean-僅用于項目-僅生成compute_ima…