剑指Offer(线程)——如何处理线程的返回值

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

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

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

实现的方式一共有三种:

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

下面我举一个案例:

在这里插入图片描述

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

在这里插入图片描述

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

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

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

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

在这里插入图片描述

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

于是我们就可以使用Callable

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

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

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

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

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

在这里插入图片描述

最后输出为:

在这里插入图片描述

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

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

在这里插入图片描述

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

发布了296 篇原创文章 · 获赞 53 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/qq_41936805/article/details/103335259