Runable Callable Future都是我们在java多线程开发中遇到的接口,那么这些接口之间有什么区别呢?
Runable
作为我们多线程开发中经常使用到的接口,它定义run方法,只要对象实现这个方法,将对象作为参数输入到new Thread(Runnable A ),线程一旦start(),那么就 自动执行了,没有任何的返回结果,无法知道什么时候结束,适用于完全异步的任务,不用关心结果。样例:
Callable
Callable定义的接口call(),它能够抛出异常,并且能够有一个返回结果。实现了Callable要想提交到线程池中, 直接通过executorService.submit(new CallAbleTask(i)),但是返回的结果是Future,结果信息从Future里面取出,具体的业务逻辑在call中执行。好了下面介绍下Future
Future
Future提供了五个接口,功能如下图:
总的来说Future,能够控制Callable对象的执行,检测是否做完,可以阻塞式获取结果,也可以等待一段时间内获取结果,具体的方法含义由上图可见:
boolean cancel(boolean mayInterruptIfRunning):用来取消任务,成功返回true,失败则返回false
boolean isCancelled():表示任务是否被取消成功,如果在任务正常完成前被取消成功,则返回 true
boolean isDone():表示任务是否已经完成,若任务完成,则返回true
V get():用来获取执行结果,这个方法会产生阻塞会一直等到任务执行完毕才返回
V get(long timeout, TimeUnit unit) 用来获取执行结果,如果在指定时间内,还没获取到结果,直接返回null
。我们看下例子
我们能够看到方法的执行都是Callable,但是最后获取结果通过Future,get的方式的话,就是一直会阻塞在那里获取。
以上总结:
Runable适用于完全异步的任务,不用操心执行情况,异常出错的。
Callable适用于需要由返回结果的,对执行中的异常要知晓的,需要提交到线程池中。
Future主要是线程池执行Callable任务,返回的结果。它能够中断任务的执行,一直等待结果,或者等待一段时间获取结果。