獲取Java執行緒返回值的幾種方式

小白一隻726發表於2019-02-20

在實際開發過程中,我們有時候會遇到主執行緒呼叫子執行緒,要等待子執行緒返回的結果來進行下一步動作的業務。

那麼怎麼獲取子執行緒返回的值呢,我這裡總結了三種方式:

  1. 主執行緒等待。
  2. Join方法等待。
  3. 實現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     }

 

相關文章