获取Java线程返回值的几种方式

2019-02-21 06:39:22来源:博客园 阅读 ()

新老客户大回馈,云服务器低至5折

在实际开发过程中,我们有时候会遇到主线程调用子线程,要等待子线程返回的结果来进行下一步动作的业务。

那么怎么获取子线程返回的值呢,我这里总结了三种方式:

  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     }

 


原文链接:https://www.cnblogs.com/alinainai/p/10409540.html
如有疑问请与原作者联系

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:单点登录原理与简单实现

下一篇:Java的三大特性:封装、继承、多态