獲取線程的返回值
-
主線程等待法,主線程調用sleep方法(讓主線程去循環等待子線程結束並賦值;缺點:代碼臃腫,等待時間無法精準控制;不推薦使用);
-
使用Thread類的join()阻塞當前線程以等待子線程處理結束(不能精準控制多個線程中的其中一個;不推薦使用);
-
通過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();
}
}
}