1. 程式人生 > >Java帶有返回結果的新執行緒:Callable

Java帶有返回結果的新執行緒:Callable

Java併發程式設計:Callable、Future和FutureTask

  在前面的文章中我們講述了建立執行緒的2種方式,一種是直接繼承Thread,另外一種就是實現Runnable介面。

  這2種方式都有一個缺陷就是:在執行完任務之後無法獲取執行結果。

  如果需要獲取執行結果,就必須通過共享變數或者使用執行緒通訊的方式來達到效果,這樣使用起來就比較麻煩。

  而自從Java 1.5開始,就提供了Callable和Future,通過它們可以在任務執行完畢之後得到任務執行結果。

  今天我們就來討論一下Callable、Future和FutureTask三個類的使用方法。以下是本文的目錄大綱:

  一.Callable與Runnable

  二.Future

  三.FutureTask

  四.使用示例

  若有不正之處請多多諒解,並歡迎批評指正。

  請尊重作者勞動成果,轉載請標明原文連結:

  http://www.cnblogs.com/dolphin0520/p/3949310.html

一.Callable與Runnable

  先說一下java.lang.Runnable吧,它是一個介面,在它裡面只聲明瞭一個run()方法:

1 2 3 public interface Runnable {
public abstract void run(); }

   由於run()方法返回值為void型別,所以在執行完任務之後無法返回任何結果。

  Callable位於java.util.concurrent包下,它也是一個介面,在它裡面也只聲明瞭一個方法,只不過這個方法叫做call():

1 2 3 4 5 6 7 8 9 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; }

   可以看到,這是一個泛型介面,call()函式返回的型別就是傳遞進來的V型別。

  那麼怎麼使用Callable呢?一般情況下是配合ExecutorService來使用的,在ExecutorService介面中聲明瞭若干個submit方法的過載版本:

1 2 3 <T> Future<T> submit(Callable<T> task); <T> Future<T> submit(Runnable task, T result); Future<?> submit(Runnable task);

  第一個submit方法裡面的引數型別就是Callable。

  暫時只需要知道Callable一般是和ExecutorService配合來使用的,具體的使用方法講在後面講述。

  一般情況下我們使用第一個submit方法和第三個submit方法,第二個submit方法很少使用。

二.Future

  Future就是對於具體的Runnable或者Callable任務的執行結果進行取消、查詢是否完成、獲取結果。必要時可以通過get方法獲取執行結果,該方法會阻塞直到任務返回結果。

  Future類位於java.util.concurrent包下,它是一個介面:

1 2 3 4 5 6 7 8 public interface Future<V> { boolean cancel(boolean mayInterruptIfRunning); boolean isCancelled(); boolean 

相關推薦

Java帶有返回結果執行Callable

Java併發程式設計:Callable、Future和FutureTask   在前面的文章中我們講述了建立執行緒的2種方式,一種是直接繼承Thread,另外一種就是實現Runnable介面。   這2種方式都有一個缺陷就是:在執行完任務之後無法獲取執行結果。   如果需要獲取執行結果,就必須通

java中開啟一個執行

//實現方法pubRmRecordByRmPlanId @Override public OperateResult pubRmRecordByRmPlanId(Long rmPlanId,String taskBeginDate,UserInfo userInfo) { ...

Callable實現帶有返回值的執行

我們都知道執行緒是沒有返回值的,在Runnable介面中,只有一個抽象的Run方法,使用Callable我們能夠實現帶有返回值得的執行緒,下面是一個demo /** * */ package com.mingrisoft.threadone; impo

執行Callable

Callable介面提供一個call()方法可以作為執行緒執行體。與run()方法不同的是:call()方法具有返回值!還可以宣告異常!   建立並啟動有返回值的執行緒步驟如下: 1)建立Callable的實現類,並實現call()方法。JAVA8開始可以使用lambda函式建

初學Java執行執行返回資料的兩種方法

從執行緒中返回資料和向執行緒傳遞資料類似。也可以通過類成員以及回撥函式來返回資料。但類成員在返回資料和傳遞資料時有一些區別,下面讓我們來看看它們區別在哪。 一、通過類變數和方法返回資料 使用這種方法返回資料需要在呼叫start方法後才能通過類變數或方法得到資料。讓我們先來看

執行 使用 Future 獲取執行返回結果

import java.util.Random; import java.util.concurrent.Callable; import java.util.concurrent.Execution

java執行5.1 鎖-基礎

什麼是鎖 提到多執行緒,立馬就有人說加鎖,什麼是鎖,為什麼加鎖? 鎖:從字面意義,什麼東西加了鎖,那麼就只有有鑰匙的人才能使用,多執行緒中的鎖,也是這個意思。 為什麼加鎖:當單執行緒的時候,無論訪問什麼資源,都不需要考慮鎖的問題,但是當多個執行緒訪問同一個資源,就會發生很多千奇百怪的

java執行3 執行狀態

執行緒從建立到結束執行,經過多個狀態,每個狀態對應著不同的操作,具體如下: 1 建立(new),2 可以執行(runnable)、3 執行(running)、4 等待(waiting)、5 阻塞(blocked)、6 結束(dead) 建立執行緒 當通過new Thre

java執行2 建立執行

如何建立一個多執行緒: Java提供了java.lang.Thread類,這就是執行緒的定義類,包含了:執行緒的優先順序,執行緒id、執行緒狀態等執行緒的基本資訊。 通過Thread類的說明,可以知道建立執行緒的兩種方式:1 extends Thread類,2 implements

java執行1程序和執行

多執行緒樣例 我們用工人卸貨舉例:有一集裝箱的貨物等待卸車,共100個箱子,一個工人一次只能搬一個箱子。 如果只有一個工人,那麼該工人需要搬運100次,而且是不停歇的搬運。 如果有5個或者10個工人,那麼平均每個工人只需要搬運20或者10次就可以了。 甚至有1

Java執行 死鎖

                         

java開啟執行的方法

一、繼承Thread類 步驟: 1):定義一個類A繼承於Java.lang.Thread類. 2):在A類中覆蓋Thread類中的run方法. 3):我們在run方法中編寫需要執行的操作:run方法裡的程式碼,執行緒執行體. 4):在main方法(執行緒)中,建立執

java執行執行的通訊、喚醒等待機制、生產消費者模式、Lock

執行緒的通訊:印表機列印–不斷的輸入輸出 package com.qianfeng.test; /* * 執行緒的通訊: * 分析: * 需要兩個執行緒--輸入執行緒和輸出執行緒 * 需要兩個任務--輸入任務和輸出任務 * 需要一份資料 * *

Java執行執行基礎

多執行緒基礎 多執行緒實現-Thread和Runnable 通常使用如下程式碼啟動一個新的執行緒: private void startNewThread1() { new Thread() { @Override pub

關於多執行/程序的一個問題傳遞給執行/程序的引數變數被修改

  今天在驗證tcp伺服器多執行緒/程序程式碼的時候,出現這樣的情況:主執行緒建立一個新執行緒/程序,並將一個整形引數通過指標形式傳遞給新的執行緒,新執行緒使用新的變數接收引數,同時主執行緒也會繼續對這個引數進行修改。 附上修改前程式碼: void func(void *arg) {   int i = *(

c++11多執行std::future , std::promise和執行返回

std::future物件可以和asych,std::packaged_task,std::promise一起使用。這篇文章集中討論std::future和std::promise。 我們經常會遇到需要得到執行緒返回結果的情況,現在的問題是我們如何實現。 舉個例子: 假設

Java併發程式設計基礎//程序每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換開銷比較大,一個程序包含1-n個執行緒 //執行緒:同一類執行緒共享程式碼和資料空間,每個執行緒擁有獨立的執行棧和程式計

1.實現多執行緒的兩種方式: (1)繼承Thread類; (2)實現Runnable介面 //程序:每個程序都有獨立的程式碼和資料空間(程序上下文),程序間的切換開銷比較大,一個程序包含1-n個執行緒 //執行緒:同一類執行緒共享程式碼和資料空間,每個執行緒擁有獨立的執行

Java執行 執行排程

 執行緒排程是Java多執行緒的核心,只有好的排程,才能充分發揮系統的效能,提高程式的執行效率。 一、休眠 休眠的目的是使執行緒讓出CPU的最簡單做法,執行緒休眠的時候,會將CPU交給其他執行緒,以便輪換執行,休眠一定時間後,執行緒會甦醒,進入準備狀態等待執行。執行緒的休眠方

java執行3、Java對多執行的支援1

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 1、Java在語言級提供了對多執行緒程式設計的支援。 2、實現多執行緒程式的兩種方式 3、後臺執行緒 4、yield方法 5、執行緒優先順序 1、Java在語言級提

java執行2、單執行程式與多執行程式

宣告:本教程不收取任何費用,歡迎轉載,尊重作者勞動成果,不得用於商業用途,侵權必究!!! 文章目錄 單執行緒程式 多執行緒程式 單執行緒程式 在程序的地址空間當中,只有一個執行緒,由這一個執行緒來完成我們程式的執行任務。 如:這就好像有一個患者要動手術,醫院由於人手緊