91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何在Java中使用FutureTask實現多線程

發布時間:2021-06-04 18:06:31 來源:億速云 閱讀:240 作者:Leah 欄目:開發技術

如何在Java中使用FutureTask實現多線程?相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。

一、FutureTask的理解

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

二、FutureTask類圖

如何在Java中使用FutureTask實現多線程

從上面的FutureTask類圖中可以看出,FutureTask實現了RunnableFuture接口,RunnableFuture接口繼承了Runnable接口和Future接口,所以FutureTask兼備Runnable和Future兩種特性

如何在Java中使用FutureTask實現多線程
如何在Java中使用FutureTask實現多線程

三、FutureTask類中常用方法

如何在Java中使用FutureTask實現多線程

1、構造方法

  • public FutureTask(Callable callable) 創建一個 FutureTask ,它將在運行時執行給定的 Callable 。 參數: callable表示可調用任務 。

  • public FutureTask(Runnable runnable,V result) 創建一個 FutureTask ,將在運行時執行給定的 Runnable ,并安排 get將在成功完成后返回給定的結果。 參數:runnable 表示可運行的任務 ;result 表示成功完成后返回的結果。

2、常用的方法

  • public boolean isCancelled() 如果此任務在正常完成之前取消,則返回 true 。

  • public boolean isDone() 返回true如果任務已完成。

  • public V get() 等待計算完成,然后檢索其結果。

  • public V get(long timeout, TimeUnit unit)如果需要等待最多在給定的時間計算完成,然后檢索其結果(如果可用)。

  • public boolean cancel(boolean mayInterruptIfRunning)嘗試取消執行此任務。

  • protected void set(V v)將此未來的結果設置為給定值,除非此未來已被設置或已被取消。

四、FutureTask類的使用示例

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

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

1、創建一個計算任務類,實現Callable接口,重寫call方法

package com.xz.thread.FutureTask;

import java.util.concurrent.Callable;

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

    private String taskName;//任務名稱

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

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

2、創建一個測試類

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) {
        //任務集合
        List<FutureTask<Integer>> futureTasks  = new ArrayList<>();
        //創建固定長度的線程池
        ExecutorService pool = Executors.newFixedThreadPool(5);
        for (int i = 1; i <= 10; i++) {
            //實例化FutureTask,傳入計算任務類
            FutureTask<Integer> futureTask = new FutureTask<>(new ComputeTask(i + ""));
            //添加到任務集合中
            futureTasks.add(futureTask);
            //提交任務到線程池
            pool.submit(futureTask);
        }
        System.out.println("所有【計算任務】提交完畢,主線程開始執行");

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

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

    }

}

3、輸出結果如下:

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

如何在Java中使用FutureTask實現多線程

看完上述內容,你們掌握如何在Java中使用FutureTask實現多線程的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

安丘市| 凤城市| 万全县| 云阳县| 元朗区| 桂阳县| 乐清市| 富民县| 壶关县| 华坪县| 迁安市| 富平县| 泗阳县| 宣恩县| 靖西县| 普兰县| 丰原市| 佛学| 阳原县| 鄂州市| 双流县| 吴堡县| 天祝| 商城县| 开远市| 罗甸县| 广南县| 黄龙县| 开封市| 长宁区| 托克托县| 镶黄旗| 常德市| 潍坊市| 榆中县| 汉源县| 左权县| 龙里县| 桃园县| 永年县| 阳信县|