欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java多線程之FutureTask的介紹及使用

 更新時間:2021年06月04日 17:11:26   作者:小志的博客  
之前介紹了線程池相關(guān)的對象,Runable Callable與Future,下面介紹FutureTask的作用,它的特性是怎樣的呢,需要的朋友可以參考下

一、FutureTask的理解

FutureTask屬于java.util.concurrent 包;FutureTask表示可取消的異步計算。FutureTask類提供了一個Future的基本實現(xiàn) ,具有啟動和取消計算的方法,查詢計算是否完整,并檢索計算結(jié)果。結(jié)果只能在計算完成后才能檢索; 如果計算尚未完成,則get方法將阻止。 一旦計算完成,則無法重新啟動或取消計算(除非使用runAndReset()調(diào)用計算 )。

二、FutureTask類圖

在這里插入圖片描述

從上面的FutureTask類圖中可以看出,F(xiàn)utureTask實現(xiàn)了RunnableFuture接口,RunnableFuture接口繼承了Runnable接口和Future接口,所以FutureTask兼?zhèn)銻unnable和Future兩種特性

在這里插入圖片描述
在這里插入圖片描述

三、FutureTask類中常用方法

在這里插入圖片描述

1、構(gòu)造方法

  • public FutureTask(Callable callable) 創(chuàng)建一個 FutureTask ,它將在運行時執(zhí)行給定的 Callable 。 參數(shù): callable表示可調(diào)用任務(wù) 。
  • public FutureTask(Runnable runnable,V result) 創(chuàng)建一個 FutureTask ,將在運行時執(zhí)行給定的 Runnable ,并安排 get將在成功完成后返回給定的結(jié)果。 參數(shù):runnable 表示可運行的任務(wù) ;result 表示成功完成后返回的結(jié)果。

2、常用的方法

  • public boolean isCancelled() 如果此任務(wù)在正常完成之前取消,則返回 true 。
  • public boolean isDone() 返回true如果任務(wù)已完成。
  • public V get() 等待計算完成,然后檢索其結(jié)果。
  • public V get(long timeout, TimeUnit unit)如果需要等待最多在給定的時間計算完成,然后檢索其結(jié)果(如果可用)。
  • public boolean cancel(boolean mayInterruptIfRunning)嘗試取消執(zhí)行此任務(wù)。
  • protected void set(V v)將此未來的結(jié)果設(shè)置為給定值,除非此未來已被設(shè)置或已被取消。

四、FutureTask類的使用示例

示例參考此博文:Java FutureTask類使用

案例場景
通過示例進行多任務(wù)計算,通過get()方法可以異步獲取執(zhí)行結(jié)果。

1、創(chuàng)建一個計算任務(wù)類,實現(xiàn)Callable接口,重寫call方法

package com.xz.thread.FutureTask;

import java.util.concurrent.Callable;

/**
 * @description: 創(chuàng)建一個計算任務(wù)類,實現(xiàn)Callable接口,重寫call方法
 * @author: xz
 * @create: 2021-06-02 22:06
 */
public class ComputeTask implements Callable<Integer> {

    private String taskName;//任務(wù)名稱

    //任務(wù)構(gòu)造器
    public ComputeTask(String taskName) {
        this.taskName = taskName;
        System.out.println("創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:" + taskName);
    }

    //計算任務(wù)的方法
    @Override
    public Integer call() throws Exception {
        Integer result = 0;
        for (int i = 1; i <=50; i++) {
            result = +i;
        }
        System.out.println("【計算任務(wù)】"+taskName +"執(zhí)行完成。");
        return result;
    }
}

2、創(chuàng)建一個測試類

package com.xz.thread.FutureTask;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;

/**
 * @description:
 * @author: xz
 * @create: 2021-06-01 22:44
 */
public class Demo {
    public static void main(String[] args) {
        //任務(wù)集合
        List<FutureTask<Integer>> futureTasks  = new ArrayList<>();
        //創(chuàng)建固定長度的線程池
        ExecutorService pool = Executors.newFixedThreadPool(5);
        for (int i = 1; i <= 10; i++) {
            //實例化FutureTask,傳入計算任務(wù)類
            FutureTask<Integer> futureTask = new FutureTask<>(new ComputeTask(i + ""));
            //添加到任務(wù)集合中
            futureTasks.add(futureTask);
            //提交任務(wù)到線程池
            pool.submit(futureTask);
        }
        System.out.println("所有【計算任務(wù)】提交完畢,主線程開始執(zhí)行");

        System.out.println("【主線程任務(wù)】開始============");
        //主線程睡眠5秒,模擬主線程做某些任務(wù)
        try {
            Thread.sleep(5000);
            System.out.println("【主線程任務(wù)】開始執(zhí)行某些任務(wù)============");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        System.out.println("【主線程任務(wù)】結(jié)束============");

        //用于打印任務(wù)執(zhí)行結(jié)果
        Integer result = 0;
        for (FutureTask<Integer> task : futureTasks) {
            try {
                //FutureTask的get()方法會自動阻塞,知道得到任務(wù)執(zhí)行結(jié)果為止
                result += task.get();
            } catch (InterruptedException e) {
                e.printStackTrace();
            } catch (ExecutionException e) {
                e.printStackTrace();
            }
        }
        //關(guān)閉線程池
        pool.shutdown();
        System.out.println("多線程多任務(wù)執(zhí)行結(jié)果:" + result);

    }

}

3、輸出結(jié)果如下:

創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:1
創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:2
創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:3
創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:4
創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:5
創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:6
創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:7
創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:8
創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:9
創(chuàng)建【計算任務(wù)】開始,計算任務(wù)名稱:10
所有【計算任務(wù)】提交完畢,主線程開始執(zhí)行
【主線程任務(wù)】開始============
【計算任務(wù)】1執(zhí)行完成。
【計算任務(wù)】2執(zhí)行完成。
【計算任務(wù)】6執(zhí)行完成。
【計算任務(wù)】7執(zhí)行完成。
【計算任務(wù)】9執(zhí)行完成。
【計算任務(wù)】10執(zhí)行完成。
【計算任務(wù)】8執(zhí)行完成。
【計算任務(wù)】4執(zhí)行完成。
【計算任務(wù)】3執(zhí)行完成。
【計算任務(wù)】5執(zhí)行完成。
【主線程任務(wù)】開始執(zhí)行某些任務(wù)============
【主線程任務(wù)】結(jié)束============
多線程多任務(wù)執(zhí)行結(jié)果:500

在這里插入圖片描述

4、結(jié)論

通過FutureTask類的get()方法可用于異步獲取執(zhí)行結(jié)果,無論FutureTask調(diào)用多少次run()或者call()方法,它都能確保只執(zhí)行一次Runable或Callable任務(wù)。

到此這篇關(guān)于Java多線程之FutureTask的介紹及使用的文章就介紹到這了,更多相關(guān)Java FutureTask內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 手把手帶你用java搞定漢諾塔

    手把手帶你用java搞定漢諾塔

    這篇文章主要給大家介紹了關(guān)于Java青蛙跳臺階問題的解決思路與代碼,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-08-08
  • springboot對接第三方微信授權(quán)及獲取用戶的頭像和昵稱等等

    springboot對接第三方微信授權(quán)及獲取用戶的頭像和昵稱等等

    這篇文章主要介紹了springboot對接第三方微信授權(quán)及獲取用戶的頭像和昵稱等等,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-01-01
  • Maven繼承與聚合詳解及作用介紹

    Maven繼承與聚合詳解及作用介紹

    繼承關(guān)系中,分為父模塊與子模塊,父模塊也被稱為 parent 模塊,子模塊會繼承父模塊的依賴,父模塊中也可以設(shè)置依賴管理器,供子模塊選擇是否需要某些依賴
    2022-08-08
  • 詳解如何編寫一個高效的Java工具類

    詳解如何編寫一個高效的Java工具類

    本文將深入探討如何編寫一個高效的Java工具類,并結(jié)合Spring
    Boot與IRIS數(shù)據(jù)庫的集成,展示一個具體的實例,有需要的小伙伴可以了解下
    2024-10-10
  • 使用java寫的矩陣乘法實例(Strassen算法)

    使用java寫的矩陣乘法實例(Strassen算法)

    這篇文章主要給大家介紹了關(guān)于如何使用java寫的矩陣乘法(Strassen算法)的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2021-02-02
  • Compare And Swap底層原理及代碼示例詳解

    Compare And Swap底層原理及代碼示例詳解

    這篇文章主要介紹了Compare And Swap底層原理及代碼示例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-10-10
  • SpringBoot Security密碼加鹽實例

    SpringBoot Security密碼加鹽實例

    這篇文章主要為打擊介紹了SpringBoot Security密碼加鹽實例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-02-02
  • 解決阿里代碼規(guī)范檢測中方法缺少javadoc注釋的問題

    解決阿里代碼規(guī)范檢測中方法缺少javadoc注釋的問題

    這篇文章主要介紹了解決阿里代碼規(guī)范檢測中方法缺少javadoc注釋的問題,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • Java面向?qū)ο笾畣卫O(shè)計模式詳解

    Java面向?qū)ο笾畣卫O(shè)計模式詳解

    這篇文章主要介紹了Java面向?qū)ο笾畣卫O(shè)計模式詳解,所謂類的單例設(shè)計模式,就是采取一定的方法保證在整個的軟件系統(tǒng)中,對某個類只能存在一個對象實例,并且該類只提供一個取得其對象實例的方法,需要的朋友可以參考下
    2024-01-01
  • nacos使用占位符${}進行參數(shù)配置的方法

    nacos使用占位符${}進行參數(shù)配置的方法

    這篇文章主要介紹了nacos如何使用占位符${}進行參數(shù)配置,本文結(jié)合示例代碼給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-12-12

最新評論