记得以前电话面试的时候,面试官出了个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方法获取结果之间进行其他操作