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

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

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

Future 介紹

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

Runnable

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

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

Callable

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

多線程future

Future

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

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

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

ExecutorService 中所有的 submit 方法都返回一個(gè) Future 對(duì)象,從而將一個(gè) Runnable 或 Callable 提交給 Executor, 可以通過(guò)返回的 Future 來(lái)取消任務(wù)或者獲取返回結(jié)果。

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

FutureTask 繼承關(guān)系:

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

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

下面來(lái)看一個(gè)計(jì)算 0~10 之間的整數(shù)之和并返回結(jié)果的例子:

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

輸出結(jié)果:

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

總結(jié)

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

相關(guān)文章

  • Java實(shí)現(xiàn)轉(zhuǎn)跳不同系統(tǒng)使用枚舉加switch的方式示例

    Java實(shí)現(xiàn)轉(zhuǎn)跳不同系統(tǒng)使用枚舉加switch的方式示例

    今天小編就為大家分享一篇關(guān)于Java實(shí)現(xiàn)轉(zhuǎn)跳不同系統(tǒng)使用枚舉加switch的方式示例,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧
    2018-12-12
  • Java實(shí)現(xiàn)選擇排序算法的實(shí)例教程

    Java實(shí)現(xiàn)選擇排序算法的實(shí)例教程

    這篇文章主要介紹了Java實(shí)現(xiàn)選擇排序算法的實(shí)例教程,選擇排序的時(shí)間復(fù)雜度為О(n&sup2;),需要的朋友可以參考下
    2016-05-05
  • java多態(tài)的向上轉(zhuǎn)型的概念及實(shí)例分析

    java多態(tài)的向上轉(zhuǎn)型的概念及實(shí)例分析

    在本篇內(nèi)容里小編給大家整理的是一篇關(guān)于java多態(tài)的向上轉(zhuǎn)型的概念及實(shí)例分析,對(duì)此有興趣的朋友們可以跟著學(xué)習(xí)下。
    2021-05-05
  • 詳解java解決分布式環(huán)境中高并發(fā)環(huán)境下數(shù)據(jù)插入重復(fù)問(wèn)題

    詳解java解決分布式環(huán)境中高并發(fā)環(huán)境下數(shù)據(jù)插入重復(fù)問(wèn)題

    這篇文章主要介紹了java解決并發(fā)數(shù)據(jù)重復(fù)問(wèn)題 ,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • IDEA部署jeesite3完美運(yùn)行教程詳解

    IDEA部署jeesite3完美運(yùn)行教程詳解

    這篇文章主要介紹了IDEA部署jeesite3完美運(yùn)行教程,本文通過(guò)圖文并茂的形式給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-09-09
  • 模仿百度紅包福袋界面實(shí)例代碼

    模仿百度紅包福袋界面實(shí)例代碼

    新年到新年到,紅包搶不停。在我搶紅包的時(shí)候意外的發(fā)現(xiàn)了百度的福袋界面挺不錯(cuò)的,于是抽時(shí)間專門寫(xiě)篇文章來(lái)完成百度紅包界面吧
    2016-02-02
  • Struts 2 配置Action詳解

    Struts 2 配置Action詳解

    本篇文章主要介紹了Struts 2 配置Action詳解,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-10-10
  • Hutool開(kāi)發(fā)MapUtil工具類使用示例

    Hutool開(kāi)發(fā)MapUtil工具類使用示例

    這篇文章主要為大家介紹了Hutool開(kāi)發(fā)MapUtil工具類使用示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 解決表單post,get到springMVC后臺(tái)亂碼的問(wèn)題

    解決表單post,get到springMVC后臺(tái)亂碼的問(wèn)題

    下面小編就為大家分享一篇解決表單post,get到springMVC后臺(tái)亂碼的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-01-01
  • Java按值傳遞和按址傳遞(面試常見(jiàn))

    Java按值傳遞和按址傳遞(面試常見(jiàn))

    這篇文章主要介紹了Java按值傳遞和按址傳遞(面試常見(jiàn))知識(shí),在面試筆試題中經(jīng)常會(huì)遇到,今天小編給大家詳細(xì)介紹下,需要的朋友可以參考下
    2017-02-02

最新評(píng)論