我们知道,run方法是一个Thread内部类的重写方法,没有参数的导入,也没有返回值的设定。但我们若是想要实现在run方法内进行传参,一共有三种方法:

  1. 构造函数传参
  2. 成员变量传参
  3. 回调函数传参

知道了如何在run方法内传参之后,那么我们如何处理线程的返回值呢?

实现的方式一共有三种:

  1. 主线程等待法:即我们让主线程循环等待,直到目标子线程返回一个值为止。

下面我举一个案例:

JAVA线程返回值获取 线程的返回值_线程池

但是如果我们使用了主线程等待法之后,就可以获取到子线程的返回值了。

JAVA线程返回值获取 线程的返回值_子线程_02

但是这个方法的缺点就在于,如果我们有很多子线程,并且等待时间未知的话,那么我们就会产生很大的未知问题了。

于是就有了第二个方法,Thread.join()。

  • 使用Thread类的join()阻塞当前线程以等待子线程处理完毕。

说白了,也就是使用join替换掉之前的子线程等待主线程。

JAVA线程返回值获取 线程的返回值_子线程_03

但是使用join说白了,还是不够细粒度,他没办法精准的操作线程进行的时间。

于是我们就可以使用Callable

  • 通过Callable接口实现:通过FutureTask Or 线程池获取

我们平时在设计线程的时候,经常都是设置为没有返回值的,在jdk5之前都是这样的,于是为了能让我们受到线程的返回值,就有了Callable接口来实现这个想法。

先写一个公共的测试类,来实现Callable接口,并且复写其中的方法:

JAVA线程返回值获取 线程的返回值_子线程_04


可以看到,这个类的意义是让我们在两句输出语句之间,相隔5秒,然后返回value的具体值,下面说说获取到value 的方法。

首先先说一下第一种方法:Future Task

JAVA线程返回值获取 线程的返回值_线程池_05

最后输出为:

JAVA线程返回值获取 线程的返回值_主线程_06

所以我们并没有显式的在主线程进行等待子线程的返回值。而是直接使用FutureTask类封装好的api去获取。

接下来再说说第二种方法,使用线程池的方法来获取到子线程的返回值:

JAVA线程返回值获取 线程的返回值_主线程_07

线程池的使用原理就比较简单了,因为我们是启用了很多个线程不断去等待接收返回值。