Callable带有返回值的线程创建
Runnable和Thread的方式创建线程,能够看到 run() 方法返回值为void,都没有办法获取到线程计算的返回值,为了解决这一问题Callable诞生了,整体感觉比较简单,就是创建一个可以获取返回结果的线程而已,下面从几方面说一下 Callable和Runnable两个的区别:
① Runnable没有返回值,Callable有返回值,同时Callable可以设置获取返回值的超时时间
② Runnable无法抛出异常,Callable可以获取到异常
可以这样理解,Callable是Runnable的一个补充。Future是Callable返回值封装的一个对象。下面从三中方式进行代码的演示 FutureTask、线程池、批量获取
FutureTask
上面的代码,可以看到创建完Callable线程之后,程序瞬间输出了第一句话,证明主线程没有阻塞,过了三秒钟之后输出了第二句话。所以主线程可以去做自己的事情,过一段时间再通过futureTask.get(),获取线程计算的结果。
这里做了2个尝试,首先 futureTask.get(),是可以自定义超时时间的,当程序定义2秒钟超时的时候,就出现如下情况:
第二个尝试是针对 futureTask.get() 是否阻塞的测试,当调用futureTask.get()方法的时候,主线程会阻塞一直到返回结果,中间也可以进行取消。
线程池
批量获取结果(CompletionService)
这里要说明的是两个获取结果的方法 poll() 和 take(),主要区别就是一个是阻塞的一个是非阻塞的。