在实际开发过程中,我们有时候会遇到主线程调用子线程,要等待子线程返回的结果来进行下一步动作的业务。
那么怎么获取子线程返回的值呢,我这里总结了三种方式:
- 主线程等待。
- 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 }