java线程创建方法只有两个?NO! 异步计算的结果如何拿到?

记得以前电话面试的时候,面试官出了个java有哪几种方法可以创建线程的问题,我心想这么简单的问题还能难倒本宝么得意,随口就答出了Thread和runnable方式,后面快结束时他说你这个问题只答对一半,还有其他方式可以创建,自己回去查资料。

这一查才知道原来java的concurrent包下有个Callable接口,通过他也可以创建线程并执行,

名称上看起来和Runnable接口有点像,实际功能也类似,不过callable功能比runnable有两个主要的增强点,他可以抛出异常,可以有返回值

看到这里是不是有点惊喜,以往在使用thread或者runnable时,痛点就是线程之间异步,主线程里拿不到新起线程的返回值,也不能catch到新线程的异常,

下面看代码如何使用Callable满足我们的要求:


可以看出上段代码中我们使用了FutureTask对象来接受异步执行结果,这个类实现了Future接口(也是concurrent包下的),这个接口的部分介绍如下:

Future<V> 说明------>V : 此 Future 的 get 方法所返回的结果类型

表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。

计算完成后只能使用 get 方法来获取结果。

--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

看到这里大家已经明白如何使用Callable了吧,但是有人会有疑问了,上面那段代码绕来绕去还不如不用线程直接执行呢,说得对,因为future.get()方法会等待线程计算结果,

我们可以在线程启动后,调用get方法获取结果之间进行其他操作


这样就可以既满足多线程并发执行,又满足主线程可以拿到新线程的执行结果。




猜你喜欢

转载自blog.csdn.net/wb_snail/article/details/78798723