如何獲取線程的返回值?

獲取線程的返回值

  1. 主線程等待法,主線程調用sleep方法(讓主線程去循環等待子線程結束並賦值;缺點:代碼臃腫,等待時間無法精準控制;不推薦使用);

  2. 使用Thread類的join()阻塞當前線程以等待子線程處理結束(不能精準控制多個線程中的其中一個;不推薦使用);

  3. 通過Callable接口實現call()獲取線程返回值(通過FutrueTask Or 線程池獲取,推薦使用)

FutrueTask的構造方法可以傳入Callable實現類的實例;
isDone()可以判斷call是否執行結束;
get()用來獲取線程完成後的返回值;

實現

Tips:由於前兩種方法都無法精準控制等待時間或者是線程對象,所以對第三種方法進行實現

CallableDemo.java

package Thread;

import java.util.concurrent.Callable;

public class CallableDemo implements Callable<String> {
    @Override
    public String call() throws Exception {
        String res = "Hello";
        System.out.println("Call ready");
        Thread.currentThread().sleep(5000);
        System.out.println("Call down");
        return res;
    }
}

FutureTaskDemo.java(FutrueTask獲取線程返回值)

package Thread;


import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

public class FutureTaskDemo {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        FutureTask futureTask = new FutureTask(new CallableDemo());
        new Thread(futureTask).start();
        if (!futureTask.isDone()){
            System.out.println("Task is not finshed,Please wait");
        }
        System.out.println("Return value is "+futureTask.get());
    }
}

在這裏插入圖片描述

ThreadPoolDemo.java(線程池獲取線程返回值)

package Thread;

import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.Future;

public class ThreadPoolDemo {

    public static void main(String[] args) {
        ExecutorService executorService = Executors.newCachedThreadPool();
        Future<String> future= executorService.submit(new CallableDemo());
        if (!future.isDone()){
            System.out.println("Task is not finshed,Please wait");
        }
        try {
            System.out.println(future.get());
        } catch (InterruptedException e) {
            e.printStackTrace();
        } catch (ExecutionException e) {
            e.printStackTrace();
        }finally {
            executorService.shutdown();
        }
    }
}

在這裏插入圖片描述

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