中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

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

Java多線程中怎么利用Future實現攜帶結果的任務

發布時間:2021-12-27 17:33:43 來源:億速云 閱讀:401 作者:柒染 欄目:開發技術

本篇文章為大家展示了Java多線程中怎么利用Future實現攜帶結果的任務,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

Future 介紹

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

Runnable

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

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

Callable

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

多線程future

Future

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

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

public interface Future<V> {
 
    // 取消任務
    boolean cancel(boolean mayInterruptIfRunning);
 
    // 判斷是否已經取消
    boolean isCancelled();
    
    // 如果任務已經結束返回 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 類實現了 Runnable、Future 接口,因此可以將它提交給 Executor 來執行。

FutureTask 繼承關系:

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

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

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

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();
        // 注意這里的區別,不需要顯示獲取返回值
        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實現攜帶結果的任務,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

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

AI

景泰县| 睢宁县| 濮阳市| 深水埗区| 北辰区| 淄博市| 满洲里市| 五常市| 甘孜县| 临清市| 千阳县| 乳山市| 贡觉县| 方正县| 沾化县| 黄陵县| 曲水县| 温泉县| 化德县| 邵武市| 卫辉市| 廉江市| 桐柏县| 界首市| 龙泉市| 新平| 龙陵县| 连州市| 永定县| 台安县| 台中县| 南安市| 新竹县| 永昌县| 蕉岭县| 和顺县| 仲巴县| 突泉县| 永靖县| 枣强县| 巴东县|