我们知道,run方法是一个Thread内部类的重写方法,没有参数的导入,也没有返回值的设定。但我们若是想要实现在run方法内进行传参,一共有三种方法:
- 构造函数传参
- 成员变量传参
- 回调函数传参
知道了如何在run方法内传参之后,那么我们如何处理线程的返回值呢?
实现的方式一共有三种:
- 主线程等待法:即我们让主线程循环等待,直到目标子线程返回一个值为止。
下面我举一个案例:
但是如果我们使用了主线程等待法之后,就可以获取到子线程的返回值了。
但是这个方法的缺点就在于,如果我们有很多子线程,并且等待时间未知的话,那么我们就会产生很大的未知问题了。
于是就有了第二个方法,Thread.join()。
- 使用Thread类的join()阻塞当前线程以等待子线程处理完毕。
说白了,也就是使用join替换掉之前的子线程等待主线程。
但是使用join说白了,还是不够细粒度,他没办法精准的操作线程进行的时间。
于是我们就可以使用Callable
- 通过Callable接口实现:通过FutureTask Or 线程池获取
我们平时在设计线程的时候,经常都是设置为没有返回值的,在jdk5之前都是这样的,于是为了能让我们受到线程的返回值,就有了Callable接口来实现这个想法。
先写一个公共的测试类,来实现Callable接口,并且复写其中的方法:
可以看到,这个类的意义是让我们在两句输出语句之间,相隔5秒,然后返回value的具体值,下面说说获取到value 的方法。
首先先说一下第一种方法:Future Task
最后输出为:
所以我们并没有显式的在主线程进行等待子线程的返回值。而是直接使用FutureTask类封装好的api去获取。
接下来再说说第二种方法,使用线程池的方法来获取到子线程的返回值:
线程池的使用原理就比较简单了,因为我们是启用了很多个线程不断去等待接收返回值。