成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

美團面試:如何實現線程任務編排?

開發 前端
線程任務編排指的是對多個線程任務按照一定的邏輯順序或條件進行組織和安排,以實現協同工作、順序執行或并行執行的一種機制。

線程任務編排指的是對多個線程任務按照一定的邏輯順序或條件進行組織和安排,以實現協同工作、順序執行或并行執行的一種機制。

1.線程任務編排 VS 線程通訊

有同學可能會想:那線程的任務編排是不是問的就是線程間通訊啊?

線程間通訊我知道了,它的實現方式總共有以下幾種方式:

  • Object 類下的 wait()、notify() 和 notifyAll() 方法;
  • Condition 類下的 await()、signal() 和 signalAll() 方法;
  • LockSupport 類下的 park() 和 unpark() 方法。

但是,線程通訊和線程的任務編排是不同的兩個概念,它們的區別如下:

  • 線程任務編排主要關注的是如何組織和管理線程執行的任務序列,確保任務按照預定的邏輯和順序執行,包括任務的啟動、停止、依賴管理、執行策略(如并行、串行)以及錯誤處理等。它是關于如何有效地規劃線程的工作流程,以達成高效和正確的程序執行目標。
  • 線程通訊則是指在多線程環境中,線程之間傳遞信息和協調工作的機制。當多個線程需要共享數據或協同完成某項任務時,它們需要通過某種方式進行溝通,以確保數據的正確性和任務的同步執行。它的重點在于解決線程間的同步問題和數據一致性問題。

簡而言之,線程任務編排側重于高層次的執行計劃和流程控制,而線程通訊則專注于底層的數據交互和同步細節。在實際應用中,有效的線程任務編排往往離不開合理的線程通訊機制,兩者相輔相成,共同支撐起復雜多線程程序的正確執行。

2.線程任務編排

線程的任務編排的實現方式主要有以下兩種:

  • FutureTask:誕生于 JDK 1.5,它實現了 Future 接口和 Runnable 接口,設計初衷是為了支持可取消的異步計算。它既可以承載 Runnable 任務(通過包裝成 RunnableAdapter),也可以承載 Callable 任務,從而能夠返回計算結果,使用它可以實現簡單的異步任務執行和結果的等待。
  • CompletableFuture:誕生于 JDK 8,它不僅實現了 Future 接口,還實現了 CompletionStage 接口。CompletionStage 是對 Future 的擴展,提供了豐富的鏈式異步編程模型,支持函數式編程風格,可以更加靈活地處理異步操作的組合和依賴回調等。

(1)FutureTask 使用

FutureTask 使用示例如下:

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;

public class FutureTaskDemo {
    public static void main(String[] args) {
        // 創建一個Callable任務
        Callable<Integer> task = () -> {
            Thread.sleep(2000); // 模擬任務耗時操作
            return 10; // 返回任務結果
        };

        // 創建FutureTask,并將Callable任務包裝起來
        FutureTask<Integer> futureTask = new FutureTask<>(task);

        // 創建線程池
        ExecutorService executor = Executors.newCachedThreadPool();

        // 提交FutureTask給線程池執行
        executor.submit(futureTask);

        try {
            // 獲取任務結果,get()方法會阻塞直到任務完成并返回結果
            int result = futureTask.get();
            System.out.println("任務結果:" + result);
        } catch (InterruptedException | ExecutionException e) {
            e.printStackTrace();
        }
    }
}

在上述示例中,通過創建一個 Callable 任務來模擬耗時操作,并使用 FutureTask 包裝該任務。然后將 FutureTask 提交給線程池執行,最后通過 get() 方法獲取任務的執行結果,之后才會執行后續流程。我們可以通過 get() 方法阻塞等待程序執行結果,從而完成線程任務的簡單編排。

(2)CompletableFuture 使用

從上面 FutureTask 實現代碼可以看出,它不但寫法麻煩,而且需要使用 get() 方法阻塞等待線程的執行結果,對于異步任務的執行來說,不夠靈活且效率也會受影響,然而 CompletableFutrue 的出現,則彌補了 FutureTask 的這些缺陷。

CompletableFutrue 提供的方法有很多,但最常用和最實用的核心方法只有以下幾個:

例如,我們現在實現一個這樣的場景:

任務描述:任務一執行完之后執行任務二,任務三和任務一和任務二一起執行,所有任務都有返回值,等任務二和任務三執行完成之后,再執行任務四,它的實現代碼如下:

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

public class CompletableFutureExample {

    public static void main(String[] args) {
        // 任務一:返回 "Task 1 result"
        CompletableFuture<String> task1 = CompletableFuture.supplyAsync(() -> {
            try {
                // 模擬耗時操作
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException(e);
            }
            return "Task 1 result";
        });
        // 任務二:依賴任務一,返回 "Task 2 result" + 任務一的結果
        CompletableFuture<String> task2 = task1.handle((result1, throwable) -> {
            try {
                // 模擬耗時操作
                Thread.sleep(1000);
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException(e);
            }
            return "Task 2 result " + result1;
        });
        // 任務三:和任務一、任務二并行執行,返回 "Task 3 result"
        CompletableFuture<String> task3 = CompletableFuture.supplyAsync(() -> {
            try {
                // 模擬耗時操作
                Thread.sleep(800); // 任務三可能比任務二先完成
            } catch (InterruptedException e) {
                Thread.currentThread().interrupt();
                throw new RuntimeException(e);
            }
            return "Task 3 result";
        });
        // 任務四:依賴任務二和任務三,等待它們都完成后執行,返回 "Task 4 result" + 任務二和任務三的結果
        CompletableFuture<String> task4 = CompletableFuture.allOf(task2, task3).handle((res, throwable) -> {
            try {
                // 這里不需要顯式等待,因為 allOf 已經保證了它們完成
                return "Task 4 result with " + task2.get() + " and " + task3.get();
            } catch (InterruptedException | ExecutionException e) {
                throw new RuntimeException(e);
            }
        });
        // 獲取任務四的結果并打印
        String finalResult = task4.join();
        System.out.println(finalResult);
    }
}

課后思考

使用 CompletableFuture 需要配合線程池一起使用嗎?為什么?CompletableFuture 默認的線程池是如何實現的?

責任編輯:姜華 來源: Java中文社群
相關推薦

2024-09-09 15:09:30

2024-05-08 00:00:00

核心線程數隊列

2021-05-12 22:07:43

并發編排任務

2018-04-23 09:50:54

2023-03-28 21:33:53

面試隔離MVCC

2023-05-22 08:17:04

2022-03-03 16:45:02

美團述職反饋

2024-06-07 08:10:14

Netty操作系統零拷貝

2018-08-03 09:42:01

人工智能深度學習人臉識別

2022-02-14 16:08:15

開源項目線程池動態可監控

2023-11-26 17:48:00

營銷策略

2025-01-09 11:24:59

線程池美團動態配置中心

2024-10-22 16:39:07

2021-08-29 18:36:17

MySQL技術面試題

2021-10-24 06:49:08

線程池中間件開源

2024-09-11 22:51:19

線程通訊Object

2016-11-27 20:43:26

云計算迭代

2024-04-09 10:40:04

2022-03-28 08:31:29

線程池定時任務

2013-08-20 13:11:58

技術美團
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 三级在线观看 | 国产黄色精品在线观看 | 久久人人爽人人爽人人片av免费 | 成人不卡视频 | 中文字幕国产精品视频 | 国产精品片aa在线观看 | 五月槐花香| 亚洲精品在线播放 | 青青草原精品99久久精品66 | 在线观看中文字幕 | 欧美性极品xxxx做受 | 亚洲精品字幕 | 99re66在线观看精品热 | 伊人超碰 | 亚洲一区| 久草在线高清 | 日韩欧美一区二区三区免费观看 | 91精品国产手机 | 亚洲一二三区精品 | 国产高清视频一区 | 精品欧美在线观看 | 亚洲免费一区 | 久草新在线 | 日韩欧美国产精品一区二区三区 | 亚洲高清免费观看 | 久久精品一区二区三区四区 | 久久影音先锋 | 欧美中文一区 | 午夜精品一区二区三区在线视 | 天天色综| 97视频在线观看网站 | 在线视频亚洲 | 999观看免费高清www | 99热视| 午夜视频在线免费观看 | 午夜激情影院 | 日韩免费视频一区二区 | 天堂成人av | 91精品久久久久 | japan25hdxxxx日本 做a的各种视频 | 久久成人一区 |