最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java多線程教程之如何利用Future實現(xiàn)攜帶結果的任務

 更新時間:2021年12月26日 09:48:12   作者:Allen?Chou  
Callable與Future兩功能是Java?5版本中加入的,這篇文章主要給大家介紹了關于Java多線程教程之如何利用Future實現(xiàn)攜帶結果任務的相關資料,需要的朋友可以參考下

Future 介紹

Future表示異步計算的結果,它提供了檢查計算是否完成的方法,以等待計算的完成,并檢索計算的結果。Future的cancel方法可以取消任務的執(zhí)行,它有一布爾參數(shù),參數(shù)為 true 表示立即中斷任務的執(zhí)行,參數(shù)為 false 表示允許正在運行的任務運行完成。Future的 get 方法等待計算完成,獲取計算結果。

Runnable

Runnable 是我們多線程開發(fā)過程中常用的接口。 Executor 框架使用 Runnable 作為其基本的任務表現(xiàn)形式。 Runnable 是一個有很大局限性的接口,run() 方法沒有返回值并且不能拋出一個受檢查的異常。

@FunctionalInterface
public interface Runnable {
    public abstract void run();
}

Callable

與 Runnable 不同,Callable 是個泛型參數(shù)化接口,它能返回線程的執(zhí)行結果,出錯時可能拋出異常。

多線程future

Future

Executor 執(zhí)行的任務有 4 個生命周期階段:創(chuàng)建、提交、開始和完成。由于有些任務執(zhí)行很耗時間,因此有些時候希望能夠取消這些任務。Executor 框架中,已經(jīng)提交但未開始的任務可以取消,已經(jīng)開始的任務只有當它們能響應中斷才能取消,取消已經(jīng)完成的任務是沒有任何影響。

Future 表示一個任務的生命周期,并提供了相應的方法來判斷任務是否已經(jīng)完成或者取消,以及獲取任務的結果和取消任務。

public interface Future<V> {
 
    // 取消任務
    boolean cancel(boolean mayInterruptIfRunning);
 
    // 判斷是否已經(jīng)取消
    boolean isCancelled();
    
    // 如果任務已經(jīng)結束返回 true
    boolean isDone();
    
    // 若有必要會一直阻塞直到結束并返回結果
    V get() throws InterruptedException, ExecutionException;
 
    // 若有必要會阻塞指定的時間等待結束并返回結果
    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}

ExecutorService 中所有的 submit 方法都返回一個 Future 對象,從而將一個 Runnable 或 Callable 提交給 Executor, 可以通過返回的 Future 來取消任務或者獲取返回結果。

還可以顯示地將某個指定的 Runnable 或 Callable 實例化為 FutureTask ,由于 FutureTask 類實現(xiàn)了 Runnable、Future 接口,因此可以將它提交給 Executor 來執(zhí)行。

FutureTask 繼承關系:

public class FutureTask<V> implements RunnableFuture<V> {
    ......
}
public interface RunnableFuture<V> extends Runnable, Future<V> {
    void run();
}

Future 和 FutureTask 的一個區(qū)別在于,F(xiàn)uture 需要通過 ExecutorService 中的 submit 方法的返回值來獲取結果,而 FutureTask 提交任務時不需要設置返回值,通過自身就可以獲取結果。

下面來看一個計算 0~10 之間的整數(shù)之和并返回結果的例子:

import java.time.LocalDateTime;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;
 
/**
 * @author :jhys
 * @date :Created in 2021/7/6 14:43
 * @Description :
 */
public class FutureTest1 {
    public static void main(String[] args) throws Exception {
        ExecutorService executor = Executors.newSingleThreadExecutor();
        System.out.println(LocalDateTime.now() + ": thread start");
        Future<Integer> future = executor.submit(() -> {
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            System.out.println(LocalDateTime.now() + ": task start");
            int sum = 0;
            for (int i = 0; i <= 10; i++) {
                sum += i;
            }
            return sum;
        });
        executor.shutdown();
        try {
            Integer ret = future.get();
            System.out.println(LocalDateTime.now() + ": ret = " + ret);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("finish");
    }
}

輸出結果:

2021-07-06T14:49:21.244: thread start

2021-07-06T14:49:24.259: task start

2021-07-06T14:49:24.259: ret = 55

finish

將上面的例子中 Future 替換為 FutureTask ,代碼如下:

public class FutureTest {
 
    public static void main(String[] args) {
 
        FutureTask<Integer> future = new FutureTask<>(() -> {
            Thread.sleep(3000);
            System.out.println(LocalDateTime.now() + ": task start");
 
            int sum = 0;
            for (int i =0; i <= 10; i++) {
                sum += i;
            }
            return sum;
        });
 
        ExecutorService executor = Executors.newSingleThreadExecutor();
        // 注意這里的區(qū)別,不需要顯示獲取返回值
        executor.submit(future);
        executor.shutdown();
 
        try {
            System.out.println(LocalDateTime.now() + ": ret = " + future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }
        System.out.println("finish");
    }
 
}

總結

到此這篇關于Java多線程教程之如何利用Future實現(xiàn)攜帶結果任務的文章就介紹到這了,更多相關Java多線程Future實現(xiàn)帶結果任務內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家

相關文章

  • springboot訪問404問題的解決辦法

    springboot訪問404問題的解決辦法

    工作中遇到url404問題,解決問題的進程比較崎嶇,寫篇文章記錄,下面這篇文章主要給大家介紹了關于springboot訪問404問題的解決辦法,文中通過圖文介紹的非常詳細,要的朋友可以參考下
    2023-03-03
  • SpringBoot集成tomcat詳解實現(xiàn)過程

    SpringBoot集成tomcat詳解實現(xiàn)過程

    采用spring boot之后,一切變得如此簡單,打包->java-jar->運維,只需要一個jar包便可以隨意部署安裝。這篇文章,將對 spring boot集成tomcat的源碼進行分析,探索其內部的原理
    2023-02-02
  • 在java中由類名和方法名字符串實現(xiàn)其調用方式

    在java中由類名和方法名字符串實現(xiàn)其調用方式

    這篇文章主要介紹了在java中由類名和方法名字符串實現(xiàn)其調用方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-09-09
  • 基于Calendar獲取當前時間的性能比較

    基于Calendar獲取當前時間的性能比較

    這篇文章主要介紹了Calendar獲取當前時間的性能比較,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2021-06-06
  • 解決springboot項目啟動失敗Could not initialize class com.fasterxml.jackson.databind.ObjectMapper問題

    解決springboot項目啟動失敗Could not initialize class&

    這篇文章主要介紹了解決springboot項目啟動失敗Could not initialize class com.fasterxml.jackson.databind.ObjectMapper問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-06-06
  • springboot實現(xiàn)攔截器的3種方式及異步執(zhí)行的思考

    springboot實現(xiàn)攔截器的3種方式及異步執(zhí)行的思考

    實際項目中,我們經(jīng)常需要輸出請求參數(shù),響應結果,方法耗時,統(tǒng)一的權限校驗等。本文首先為大家介紹 HTTP 請求中三種常見的攔截實現(xiàn),并且比較一下其中的差異。感興趣的可以了解一下
    2021-07-07
  • mybatis動態(tài)sql之Map參數(shù)的講解

    mybatis動態(tài)sql之Map參數(shù)的講解

    今天小編就為大家分享一篇關于mybatis動態(tài)sql之Map參數(shù)的講解,小編覺得內容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-03-03
  • Java實現(xiàn)md5和base64加密解密的示例代碼

    Java實現(xiàn)md5和base64加密解密的示例代碼

    這篇文章主要介紹了Java實現(xiàn)md5和base64加密解密的示例代碼,幫助大家更好的利用Java加密解密文件,感興趣的朋友可以了解下
    2020-09-09
  • Java C++ leetcode執(zhí)行一次字符串交換能否使兩個字符串相等

    Java C++ leetcode執(zhí)行一次字符串交換能否使兩個字符串相等

    這篇文章主要為大家介紹了Java C++ leetcode1790執(zhí)行一次字符串交換能否使兩個字符串相等,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • 深入淺析Java反射機制

    深入淺析Java反射機制

    Java反射機制是在運行狀態(tài)中,對于任意一個類,都能夠知道這個類的所有屬性和方法;對于任意一個對象,都能夠調用它的任意一個方法和屬性;這種動態(tài)獲取的信息以及動態(tài)調用對象的方法的功能稱為Java語言的反射機制
    2015-11-11

最新評論

鹿泉市| 安国市| 灵台县| 松滋市| 广河县| 邓州市| 宜黄县| 汨罗市| 淮南市| 百色市| 兴安县| 玉山县| 白城市| 海林市| 昌黎县| 德昌县| 肇东市| 玉树县| 镇雄县| 长岛县| 怀化市| 绥芬河市| 云林县| 牟定县| 宝丰县| 盐山县| 辉南县| 新兴县| 巴林右旗| 茶陵县| 陇南市| 福贡县| 东海县| 久治县| 盱眙县| 靖江市| 静宁县| 怀安县| 全椒县| 蒙自县| 东宁县|