1. 程式人生 > >多執行緒-從Future物件中獲取執行緒處理Callable方法的結果

多執行緒-從Future物件中獲取執行緒處理Callable方法的結果

Runnable 介面應該由那些打算通過某一執行緒執行其例項的類來實現。類必須定義一個稱為 run 的無引數方法。

以上為Runnable介面的描述,明確可以看出,實現Runnable子類的例項是被執行緒來執行的。但是看看run方法的定義為void,因此,獲取run方法中的處理結果比較麻煩,這時候jdk1.5提供瞭解決辦法。1.5之後提供了

java.util.concurrent

包,該包下面有個callable<V>介面,該介面是泛型介面,泛型型別就是你的返回值型別,下面是介面定義。

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;
}


可以看到和Runnable最大的區別就是由返回值型別。這個介面可以說完全是和Runnable一樣的,區別是一個是有返回值一個是無返回值。

下面我們來實現它。

public class MyCall implements Callable<String> {

    @Override
    public String call() throws Exception {
        System.out.println("=========");
        return "return value 123";
    }

}

但是想想就算我們可以有返回值了,但是要如何獲取這個返回值呢,也就是我們要在哪裡 get()

返回值呢?

Thread類中肯定是沒有的,而且,如果我們new Thread類會發現沒有建構函式引數為Callable<V>,這就比較尷尬了。

所以,如果讓我們自己來做的話,那唯一的辦法可能就是讓某個類,實現Runable方法,然後這個實現類的run方法中呼叫callable,然後獲取返回值。

實際上,Future就是這麼做的,Future 表示非同步計算的結果。它提供了檢查計算是否完成的方法,以等待計算的完成,並獲取計算的結果。

Future本身是個介面,因為我們需要用到它的實現類 FutureTask<V>

public class FutureTask<V> implements RunnableFuture<V>
public interface RunnableFuture<V> extends Runnable, Future<V>

以上類繼承結構可以看出,FutureTask同時繼承了Runable以及Future,也就意味著,FutureTask可以被執行緒執行,同時也可以獲取到執行緒執行後的計算結果。

然後看FutureTask的建構函式。



以上建構函式很明顯,FutureTask既可以獲取執行緒的計算結果也可以不需要返回結果。

到這裡我想我們可以自己來編寫測試程式碼了。

FutureTask<String> future = new FutureTask<String>(new MyCall());
        Thread thread = new Thread(future);
        thread.start();
        System.out.println(future.get());
        System.out.println(future.get());

輸出:

=========
return value 123
return value 123


至於為什麼只輸出一遍=====,這就是我們之前說的,Future呼叫了Callable並且獲取記錄了返回值,而call方法他其實只走了一遍。

最後一圖流。


參考資料

http://blog.csdn.net/ghsau/article/details/7451464

相關推薦

執行-Future物件獲取執行處理Callable方法結果

Runnable 介面應該由那些打算通過某一執行緒執行其例項的類來實現。類必須定義一個稱為 run 的無引數方法。 以上為Runnable介面的描述,明確可以看出,實現Runnable子類的例項是被執行緒來執行的。但是看看run方法的定義為void,因此,獲取run方法中

js方法json物件獲取特定值

 //從json中獲得key指定值     function getJsonValue(obj,name){         var result = null;         var v

使用引數攔截器通過註解直接JSON物件獲取資料

場景:當前段傳過來的物件是JSON物件,當時我們使用的時候又是僅僅使用其中的部分欄位值的時候,可以通過實現引數攔截器來為我們自動將JSON中的key值賦值給引數 程式碼 1.自定義註解 @Target(ElementType.PARAMETER) @Retention(Re

Java檔案路徑獲取檔名的幾種方法

Java從檔案路徑中獲取檔名的幾種方法 舉例:String fName =” G:\Java_Source\navigation_tigra_menu\demo1\img\lev1_arrow.gif ” 方法一: ? View Code 

AndroidManifest.xml獲取已註冊Activity的方法

契機:在學習並積累自定義控制元件,為了看效果,需要放到Activity中來顯示。每次寫新的自定義控制元件,不可能都放到同一個Activity中,為了更好觀看效果,每個Activity中只放少數控制元件。如此,隨著自定義控制元件增多,Activity也逐漸增多,相應的需要在A

thymeleaf和freemarker物件獲取時間並格式化,同時非空判斷

thymeleaf,freemarker從物件中獲取時間並格式化,同時非空判斷 freemarker物件非空判斷:${(creditInformationDO.delFlag)!} freemarker從物件中獲取時間並格式化:${(creditInformationD

mongodb內嵌資料物件獲取指定元素

在mognodb中, 如果資料結果類似如下: { "_id" : ObjectId("67c898c2561e44e13a580f79"), "_class" : "com", "vin" : "123", "msg" : [ { "data" : {

qt執行 擁有權 一個物件屬於哪個執行

一個物件的執行緒就是建立該物件時的執行緒,而不論該物件的定義是儲存在那個執行緒中; 子執行緒中定義的物件的情況:( 其實也好理解,子執行緒中,建立otherObj的時候,不再run()函式中,所以,otherObj物件不屬於MyTHread ) class My

如何在java獲取執行非同步執行之後的結果

java中提供了Future<V>介面和實現了Future介面的FutureTask<V> 類來將執行緒執行之後的結果返回(通過get()方法)。 1.Future<V>介面 Runnable介面執行任務是不返回任何值的,Runnable

執行】檢視JVM執行名(ThreadGroup)

ThreadGroup類的常用方法activeCount()——返回此執行緒組中活動執行緒的估計數activeGroupCount()——返回此執行緒組中活動執行緒組的估計數enumerate(Thread[] list,boolean recurse)——把此執行緒組中所有

Cocos2d-x3.0 代碼獲取cocostudio編輯的UI控件

ucid 編輯 top ica sans sce nero val -i 依據名字查找控件 須要包括的頭文件及名字空間: #include "cocostudio/CocoStudio.h"#include "ui/CocosGUI.h"using namespac

package.json獲取屬性

pack tps .json over href from version span package var pjson = require(‘./package.json‘); console.log(pjson.version); 詳見:https://stack

volley6--CacheDispatcher緩存獲取數據

splay nbsp anti without .post getc rri software req 源碼: 1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 *

volley7--NetworkDispatcher網絡獲取數據

ota ria ould min over med unless col call 源碼: 1 /* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed u

[轉]使用@Test 也可以spring容器獲取依賴註入

oca fig article ring1 detail ice 如果 text resource 轉自:http://blog.csdn.net/u010987379/article/details/52091790 @RunWith(SpringJUnit4Cla

postman實現response headers獲取cookie,並將其設置為環境變量

png header 參數 ESS 數組 字段 分割 src 圖片 1.最近在學習postman的使用方法,為了保證後續模塊操作,必須在登錄時獲取的session值,並將其設置為環境變量,session的位置處於response headers裏面返回的set-cookie

運用反射bean物件取出屬性 頁面顯示list優化

最近有一個需求,優化頁面list下拉列表顯示和資料庫的查詢,在頁面顯示的物件list下拉框的值改為根據指定的欄位查詢,並且封裝到一個統一的LabelVO類中。 如何把查詢到的物件中需要的屬性名和值取出來放到LabelVO中是個問題,然後想到了用反射能不能解決,於是在網上查了一下,發現可以實現

php 指定數字獲取隨機組合的方法

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

資料夾獲取指定檔案的檔名

從資料夾中獲取指定檔案的檔名 有時候我們需要從資料夾中判斷一個指定的檔案是否存在,如果存在就返回檔名+字尾名,不存在返回空。前臺可以根據此判斷選擇性的進行圖片的展示情況。 前臺請求獲取響應的檔名 1.配置檔案內:配置路徑資訊 #圖片儲存路徑 本地磁碟C 下面的"XX資料夾"