在實際開發過程中,我們有時候會遇到主執行緒呼叫子執行緒,要等待子執行緒返回的結果來進行下一步動作的業務。
那麼怎麼獲取子執行緒返回的值呢,我這裡總結了三種方式:
- 主執行緒等待。
- Join方法等待。
- 實現Callable介面。
Entity類
1 package com.basic.thread; 2 3 /** 4 * @author zhangxingrui 5 * @create 2019-02-17 22:14 6 **/ 7 public class Entity { 8 9 private String name; 10 11 public String getName() { 12 return name; 13 } 14 15 public void setName(String name) { 16 this.name = name; 17 } 18 }
主執行緒等待(這個一看程式碼便知曉,沒什麼問題)
1 public static void main(String[] args) throws InterruptedException { 2 Entity entity = new Entity(); 3 Thread thread = new Thread(new MyRunnable(entity)); 4 thread.start(); 5 // 獲取子執行緒的返回值:主執行緒等待法 6 while (entity.getName() == null){ 7 Thread.sleep(1000); 8 } 9 System.out.println(entity.getName()); 10 }
Join方法阻塞當前執行緒以等待子執行緒執行完畢
1 public static void main(String[] args) throws InterruptedException { 2 Entity entity = new Entity(); 3 Thread thread = new Thread(new MyRunnable(entity)); 4 thread.start(); 5 // 獲取子執行緒的返回值:Thread的join方法來阻塞主執行緒,直到子執行緒返回 6 thread.join(); 7 System.out.println(entity.getName()); 8 }
通過實現Callable介面
這裡又分為兩種情況,通過FutureTask或執行緒池。
FutureTask
1 @SuppressWarnings("all") 2 public static void main(String[] args) throws ExecutionException, InterruptedException { 3 FutureTask futureTask = new FutureTask(new MyCallable()); 4 Thread thread = new Thread(futureTask); 5 thread.start(); 6 if(!futureTask.isDone()) 7 System.out.println("task has not finished!"); 8 System.out.println(futureTask.get()); 9 }
執行緒池
1 @SuppressWarnings("all") 2 public static void main(String[] args) throws ExecutionException, InterruptedException { 3 ExecutorService executorService = Executors.newCachedThreadPool(); 4 Future future = executorService.submit(new MyCallable()); 5 if(!future.isDone()) 6 System.out.println("task has not finished!"); 7 System.out.println(future.get()); 8 }