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