剑指Offer(线程)——如何实现处理线程的返回值
run方法是Thread内部类中一个重写的方法没有参数传入,也没有返回值。如果想在实现run方法时传参有三种方法:
- 构造函数传参
- 成员变量传参
- 回调函数传参
了解了如何在run方法内进行传参之后,那么要如何实现处理线程的返回值呢?
实现处理线程的返回值一共有三种方法:
1、主线程等待法
使主线程循环等待知道目标子线程返回值为止;
下面是一个简单的demo:
使用主线程等待法之后就能获取到子线程的返回值:
缺点在于如果存在很多的子线程并且等待的时间也不确定的话就会产生很大的未知问题。
2、使用Thread类的join()阻塞当前的线程以等待子线程处理完毕
简单来讲就是使用join替换掉之前的子线程去等待主线程:
但是join还是存在缺点就是粒度不够细,没有办法精准的进行操作线程运行时间的判断。
3、通过Callable接口实现:通过FutureTask或线程池实现
使用线程时候一般情况下都是没有返回值的,JDK5之前是这样的,Callable这个接口就可以收到线程的返回值。
一个实体类实现Callable接口:
在两句输出语句之间,返回value的值,获取value值的方法有两种:
- FutureTask
输出结果为: - 使用线程池方法来获取子线程的返回值
线程池的原理比较简单是启用了很多线程去等待接收返回值。