java多线程4-如何实现处理线程的返回值
2021-03-04 本文已影响0人
那钱有着落吗

1.实现处理线程的返回值方法一 主线程等待法
我们创建了一个子线程去处理数据,但是不知道什么时候处理完,那么就可以主线程一直等待着,知道有返回数据,这个时候在执行主线程即可。


方法虽然简单,但是缺点也很明确,如果你需要等待的数据过多,代码就会显得非常臃肿混乱了,而且也无法做到精准的控制,我们不知道要等待多久
2.使用Thread类中的join方法阻塞当前线程以等待子线程处理完毕
这里就只需要将循环等待的代码换成t.join()就可以了,这个时候直到子线程处理完毕,主线程才解开阻塞继续往下面走。
3.通过Callable接口实现:通过FutureTask 或者 线程池获取
通过Callalbe接口,就会得到一个future的对象,这个对象可以使用get方法获取返回值。
- A.下面是通过FutureTask实现callable接口的实例:


下面是FutureTask类:



这个get方法主要是用来阻塞当前调用该方法的线程,知道call方法执行完毕为止,就可以取到返回值了。

我们看到还有一个get方法,这个方法传入了一个时间,大概逻辑就是在这个时间内如果还没有得到返回值,就报错超时。

- B. 下面是通过线程池来实现callable接口的实例:
下面是Future类:




这么一来我们就清楚了FutureTask是实现了Future接口的方法。

使用了线程池的方法我们是可以批量的执行多线程的。