java的future使用方法的簡單介紹

本文目錄一覽:

java future函數的作用

在並發編程時,一般使用runnable,然後扔給線程池完事,這種情況下不需要線程的結果。

所以run的返回值是void類型。

如果是一個多線程協作程序,比如菲波拉切數列,1,1,2,3,5,8…使用多線程來計算。

但後者需要前者的結果,就需要用callable介面了。

callable用法和runnable一樣,只不過調用的是call方法,該方法有一個泛型返回值類型,你可以任意指定。

線程是屬於非同步計算模型,所以你不可能直接從別的線程中得到函數返回值。

這時候,Future就出場了。Futrue可以監視目標線程調用call的情況,當你調用Future的get()方法以獲得結果時,當前線程就開始阻塞,直接call方法結束返回結果。

什麼是java future模式

Future介紹

用過Java並發包的朋友或許對Future (interface) 已經比較熟悉了,其實Future 本身是一種被廣泛運用的並發設計模式,可在很大程度上簡化需要數據流同步的並發應用開發。

Future模式可以簡單的看成是 Proxy 模式 與 Thread-Per-Message 模式 的結合,在Proxy模式中,用一個Proxy來代替真正的目標(Subject)生成,目標的生成可能是費時的,例如在開啟一個內嵌圖片的文件中,希望程式能儘快完成開啟文件的動作,並顯示一個可接受的畫面給使用者看,在還不需要看到圖片的頁面中先使用Proxy代替真正的圖片載入,只有在真正需要看到圖片時,才由Proxy物件載入真正的圖片。

考慮這樣一個情況,使用者可能快速翻頁瀏覽文件中,而圖片檔案很大,如此在瀏覽到有圖片的頁數時,就會導致圖片的載入,因而造成使用者瀏覽文件時會有停頓的現象,所以我們希望在文件開啟之後,仍有一個背景作業持續載入圖片,如此使用者在快速瀏覽頁面時,所造成的停頓可以獲得改善。

Future模式在請求發生時,會先產生一個Future物件給發出請求的客戶,它的作用就像是Proxy物件,而同時間,真正的目標物件之生成,由一個新的執行緒持續進行(即Thread-Per-Message),真正的目標物件生成之後,將之設定至Future之中,而當客戶端真正需要目標物件時,目標物件也已經準備好,可以讓客戶提取使用。

這裡就以java.util.concurrent.Future 為例簡單說一下Future的具體工作方式。Future對象本身可以看作是一個顯式的引用,一個對非同步處理結果的引用。由於其非同步性質,在創建之初,它所引用的對象可能還並不可用(比如尚在運算中,網路傳輸中或等待中)。這時,得到Future的程序流程如果並不急於使用Future所引用的對象,那麼它可以做其它任何想做的事兒,當流程進行到需要Future背後引用的對象時,可能有兩種情況:

希望能看到這個對象可用,並完成一些相關的後續流程。如果實在不可用,也可以進入其它分支流程。

「沒有你我的人生就會失去意義,所以就算海枯石爛,我也要等到你。」(當然,如果實在沒有毅力枯等下去,設一個超時也是可以理解的)

求大神,Java自帶的Future多線程模式是什麼意思

理1:

什麼是Future?

用過Java並發包的朋友或許對Future (interface) 已經比較熟悉了,其實Future

本身是一種被廣泛運用的並發設計模式,可在很大程度上簡化需要數據流同步的並發應用開發。在一些領域語言(如Alice ML

)中甚至直接於語法層面支持Future。

這裡就以java.util.concurrent.Future

為例簡單說一下Future的具體工作方式。Future對象本身可以看作是一個顯式的引用,一個對非同步處理結果的引用。由於其非同步性質,在創建之初,它

所引用的對象可能還並不可用(比如尚在運算中,網路傳輸中或等待中)。這時,得到Future的程序流程如果並不急於使用Future所引用的對象,那麼

它可以做其它任何想做的事兒,當流程進行到需要Future背後引用的對象時,可能有兩種情況:

希望能看到這個對象可用,並完成一些相關的後續流程。如果實在不可用,也可以進入其它分支流程。

「沒有你我的人生就會失去意義,所以就算海枯石爛,我也要等到你。」(當然,如果實在沒有毅力枯等下去,設一個超時也是可以理解的)

對於前一種情況,可以通過調用Future.isDone()判斷引用的對象是否就緒,並採取不同的處理;而後一種情況則只需調用get()或

get(long timeout, TimeUnit unit)通過同步阻塞方式等待對象就緒。實際運行期是阻塞還是立即返回就取決於get()的調用時機和對象就緒的先後了。

整理二:

什麼是Future模式呢?Future

顧名思義,在金融行業叫期權,市場上有看跌期權和看漲期權,你可以在現在(比如九月份)購買年底(十二月)的石油,假如你買的是看漲期權,那麼如果石油真

的漲了,你也可以在十二月份依照九月份商定的價格購買。扯遠了,Future就是你可以拿到未來的結果。對於多線程,如果線程A要等待線程B的結果,那麼

線程A沒必要等待B,直到B有結果,可以先拿到一個未來的Future,等B有結果是再取真實的結果。其實這個模式用的很多,比如瀏覽器下載圖片的時候,

剛開始是不是通過模糊的圖片來代替最後的圖片,等下載圖片的線程下載完圖片後在替換。

補充:

當另外一個線程需要使用某一個線程的結果時,可以通過Future引用的get()方法去獲得,如果結果還未出來,調用此方法的線程被block,直到結果出來。(這種機制是為了更好地適應多線程環境)

原創文章,作者:KDDYS,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/317854.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
KDDYS的頭像KDDYS
上一篇 2025-01-11 16:28
下一篇 2025-01-11 16:28

相關推薦

  • Java JsonPath 效率優化指南

    本篇文章將深入探討Java JsonPath的效率問題,並提供一些優化方案。 一、JsonPath 簡介 JsonPath是一個可用於從JSON數據中獲取信息的庫。它提供了一種DS…

    編程 2025-04-29
  • java client.getacsresponse 編譯報錯解決方法

    java client.getacsresponse 編譯報錯是Java編程過程中常見的錯誤,常見的原因是代碼的語法錯誤、類庫依賴問題和編譯環境的配置問題。下面將從多個方面進行分析…

    編程 2025-04-29
  • Java Bean載入過程

    Java Bean載入過程涉及到類載入器、反射機制和Java虛擬機的執行過程。在本文中,將從這三個方面詳細闡述Java Bean載入的過程。 一、類載入器 類載入器是Java虛擬機…

    編程 2025-04-29
  • Java騰訊雲音視頻對接

    本文旨在從多個方面詳細闡述Java騰訊雲音視頻對接,提供完整的代碼示例。 一、騰訊雲音視頻介紹 騰訊雲音視頻服務(Cloud Tencent Real-Time Communica…

    編程 2025-04-29
  • Java Milvus SearchParam withoutFields用法介紹

    本文將詳細介紹Java Milvus SearchParam withoutFields的相關知識和用法。 一、什麼是Java Milvus SearchParam without…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • Java 8中某一周的周一

    Java 8是Java語言中的一個版本,於2014年3月18日發布。本文將從多個方面對Java 8中某一周的周一進行詳細的闡述。 一、數組處理 Java 8新特性之一是Stream…

    編程 2025-04-29
  • Java判斷字元串是否存在多個

    本文將從以下幾個方面詳細闡述如何使用Java判斷一個字元串中是否存在多個指定字元: 一、字元串遍歷 字元串是Java編程中非常重要的一種數據類型。要判斷字元串中是否存在多個指定字元…

    編程 2025-04-29
  • Python簡單數學計算

    本文將從多個方面介紹Python的簡單數學計算,包括基礎運算符、函數、庫以及實際應用場景。 一、基礎運算符 Python提供了基礎的算術運算符,包括加(+)、減(-)、乘(*)、除…

    編程 2025-04-29
  • Python滿天星代碼:讓編程變得更加簡單

    本文將從多個方面詳細闡述Python滿天星代碼,為大家介紹它的優點以及如何在編程中使用。無論是剛剛接觸編程還是資深程序員,都能從中獲得一定的收穫。 一、簡介 Python滿天星代碼…

    編程 2025-04-29

發表回復

登錄後才能評論