併發編程FutureTask快速上手Demo

首先看一下下邊這段代碼,很簡單直接拿去跑一下,註釋也很全。有兩種方式分別是線程池執行和Trhead執行

import java.util.concurrent.*;

public class JxdFutureTask {
    public static void main(String[] args) throws ExecutionException, InterruptedException {

        FutureTask<String> futureTask = new FutureTask<String>(()->"FutureTask 線程池 ---");//實現Callable接口

        //方法一,線程池方式獲取結果
        ExecutorService executorService = Executors.newCachedThreadPool();
        //創建線程池
        executorService.submit(futureTask);
        //提交futureTask
        //獲取計算結果
        String result =futureTask.get();
        System.out.println(result);

        executorService.shutdown();//關閉線程


        //方法二,Thread方式獲取結果
        FutureTask<String> futureTaskThread= new FutureTask<String>(()->"FutureTask Thread ---");//實現Callable接口
        Thread t1 = new Thread(futureTaskThread);
        t1.start();
        String resultThread =futureTaskThread.get();
        System.out.println(resultThread);

        /**ThreadPoolExecutor
         * 提供的三種sumit
         *
         * 1.sumit(Runnable task) 提交Runnable 的run()沒有返回值,所以sumit(Runnable task)這個
         * 方法返回的Future僅可用來斷言任務已經結束,類似於Thread.join()。
         * 2.sumit(Callable<T> task) Callable 只有一個call()方法,並且這個方法是由返回值的,所以這個方法
         * 返回的Future對象可以通過調用其get()方法來獲取任務執行結果
         *
         *   FutureTask 的使用
         *   1.構造參數 提供兩種方式和上邊的一樣 不在贅述。
         *   2.FutureTask實現了Runnable 和Future接口
         *  new FutureTask<>(Callable<V> callable)
         *  new FutureTask<>(Runnable task,V result)
         *
         */
    }
}

實際寫一段代碼小Demo ,加入我們現在需要做紅燒魚,步驟如下圖所示

 

任務1的代碼

import java.util.concurrent.Callable;
import java.util.concurrent.TimeUnit;

public class TeaTask1 implements Callable<String> {
    @Override
    public String call() throws Exception {

        System.out.println("開始殺魚");
        TimeUnit.SECONDS.sleep(3);//假設執行時間1秒
        System.out.println("執行去魚鱗,清洗內臟");
        TimeUnit.SECONDS.sleep(3);//假設執行時間1秒
        System.out.println("鯉魚清洗完成");
        System.out.println("把鯉魚送到廚房");
        TimeUnit.SECONDS.sleep(3);
        return "鯉魚";
    }
}

任務二的代碼

import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import java.util.concurrent.TimeUnit;

public class TeaTask2 implements Callable<String> {
    FutureTask<String> futureTask;
    public TeaTask2(FutureTask<String> futureTask) {
        this.futureTask = futureTask;
    }

    @Override
    public String call() throws Exception {
        System.out.println("刷鍋");
        TimeUnit.SECONDS.sleep(1);//假設執行時間1秒
        System.out.println("準備調料");
        TimeUnit.SECONDS.sleep(1);//假設執行時間1秒
        System.out.println("起鍋燒油");
        TimeUnit.SECONDS.sleep(1);//假設執行時間1秒
        String result = futureTask.get();//獲取另一個線程的結果
        System.out.println("開始做菜獲取" + result);
        TimeUnit.SECONDS.sleep(1);//假設執行時間1秒
        return "紅燒" + result + "上桌";
    }
}

開始測試

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.FutureTask;
public class TeaTest {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        TeaTask1 tea1 = new TeaTask1();
        FutureTask<String> teaTask1 = new FutureTask<>(tea1);//執行清晰鯉魚的任務
        TeaTask2 tea2 = new TeaTask2(teaTask1);
        FutureTask<String> teaTask2 = new FutureTask<>(tea2);//執行做紅燒鯉魚的任務
        ExecutorService executorService = Executors.newCachedThreadPool();
        executorService.submit(teaTask1);
        executorService.submit(teaTask2);
        System.out.println(teaTask2.get());//完成
        executorService.shutdown();

    }
}

解釋結果:
開始殺魚
刷鍋
準備調料
起鍋燒油
執行去魚鱗,清洗內臟
鯉魚清洗完成
把鯉魚送到廚房
開始做菜獲取鯉魚
紅燒鯉魚上桌

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章