欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-01-16 16:06:41
在实际开发过程中,我们有时候会遇到主线程调用子线程,要等待子线程返回的结果来进行下一步动作的业务。 那么怎么获取子线程返回的值呢,我这里总结了三种方式: Entity类 主线程等待(这个一看代码便知晓,没什么问题) Join方法阻塞当前线程以等待子线程执行完毕 通过实现Callable接口 这里又分 ......

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

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

  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     }