淺析Java和Scala中的Future
隨著CPU的核數(shù)的增加,異步編程模型在并發(fā)領(lǐng)域中的得到了越來越多的應(yīng)用,由于Scala是一門函數(shù)式語言,天然的支持異步編程模型,今天主要來看一下Java和Scala中的Futrue,帶你走入異步編程的大門。
Future
很多同學(xué)可能會(huì)有疑問,F(xiàn)utrue跟異步編程有什么關(guān)系?從Future的表面意思是未來,一個(gè)Future對象可以看出一個(gè)將來得到的結(jié)果,這就和異步執(zhí)行的概念很像,你只管自己去執(zhí)行,只要將最終的結(jié)果傳達(dá)給我就行,線程不必一直暫停等待結(jié)果,可以在具體異步任務(wù)執(zhí)行的時(shí)候去執(zhí)行其他操作,舉個(gè)例子:

async work
我們現(xiàn)在在執(zhí)行做飯這么一個(gè)任務(wù),它需要煮飯,燒菜,擺置餐具等操作,如果我們通過異步這種概念去執(zhí)行這個(gè)任務(wù),比如煮飯可能需要比較久的時(shí)間,但煮飯這個(gè)過程又不需要我們管理,我們可以利用這段時(shí)間去燒菜,燒菜過程中也可能有空閑時(shí)間,我們可以去擺置餐具,當(dāng)電飯鍋通知我們飯燒好了,菜也燒好了,最后我們就可以開始吃飯了,所以說,上面的“煮飯 -> 飯”,“燒菜 -> 菜”都可以看成一個(gè)Future的過程。
Java中的Future
在Java的早期版本中,我們不能得到線程的執(zhí)行結(jié)果,不管是繼承Thread類還是實(shí)現(xiàn)Runnable接口,都無法獲取線程的執(zhí)行結(jié)果,所以我們只能在線程執(zhí)行的run方法里去做相應(yīng)的一些業(yè)務(wù)邏輯操作,但隨著Java5的發(fā)布,它為了我們帶來了Callable和Future接口,我們可以利用這兩個(gè)接口的特性來獲取線程的執(zhí)行結(jié)果。
Callable接口
通俗的講,Callable接口也是一個(gè)線程執(zhí)行類接口,那么它跟Runnable接口有什么區(qū)別呢?我們先來看看它們兩個(gè)的定義:
1.Callable接口:
@FunctionalInterface
public interface Callable<V> {
/**
* Computes a result, or throws an exception if unable to do so.
*
* @return computed result
* @throws Exception if unable to compute a result
*/
V call() throws Exception;
}
2.Runnable接口:
@FunctionalInterface
public interface Runnable {
public abstract void run();
}
從上面的定義,我們可以看出,兩者最大的區(qū)別就是對應(yīng)的執(zhí)行方法是否有返回值。Callable接口中call方法具有返回值,這便是為什么我們可以通過Callable接口來得到一個(gè)線程執(zhí)行的返回值或者是異常信息。
Future接口
上面說到既然Callable接口能返回線程執(zhí)行的結(jié)果,那么為什么還需要Future接口呢?因?yàn)镃allable接口執(zhí)行的結(jié)果只是一個(gè)將來的結(jié)果值,我們?nèi)羰切枰玫骄唧w的結(jié)果就必須利用Future接口,另外Callable接口需要委托ExecutorService的submit提交任務(wù)去執(zhí)行,我們來看看它是如何定義的:
<T> Future<T> submit(Callable<T> task);
public <T> Future<T> submit(Callable<T> task) {
if (task == null) throw new NullPointerException();
RunnableFuture<T> ftask = newTaskFor(task);
execute(ftask);
return ftask;
}
總結(jié)
以上所述是小編給大家介紹的Java和Scala中的Future,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關(guān)文章
Springboot實(shí)現(xiàn)異步任務(wù)線程池代碼實(shí)例
這篇文章主要介紹了Springboot實(shí)現(xiàn)異步任務(wù)線程池代碼實(shí)例,異步任務(wù)線程池是一種用于處理異步任務(wù)的機(jī)制,它可以提高程序的并發(fā)性能和響應(yīng)速度,通過將任務(wù)提交給線程池,線程池會(huì)自動(dòng)管理線程的創(chuàng)建和銷毀,從而避免了頻繁創(chuàng)建和銷毀線程的開銷,需要的朋友可以參考下2023-10-10
Java探索之Hibernate主鍵生成策略詳細(xì)介紹
這篇文章主要介紹了Java探索之Hibernate主鍵生成策略詳細(xì)介紹,具有一定參考價(jià)值,需要的朋友可以了解下。2017-10-10
詳解Spring Boot 目錄文件結(jié)構(gòu)
這篇文章主要介紹了Spring Boot 目錄文件結(jié)構(gòu)的相關(guān)資料,文中示例代碼非常詳細(xì),幫助大家更好的理解和學(xué)習(xí),感興趣的朋友可以了解下2020-07-07
Springboot如何根據(jù)實(shí)體類生成數(shù)據(jù)庫表
java正則表達(dá)式處理花括號內(nèi)容替換賦值問題
通過JDBC連接oracle數(shù)據(jù)庫的十大技巧

