执行框架(Executor Framework)的优势之一就是,可以在运行并发任务的时候返回结果。但是需要以下两个类
来实现功能:
- 接口 Callable<V>
返回结果并且可能抛出异常的任务。实现者定义了一个不带任何参数的叫做 call 的方法。
Callable 接口类似于 Runnable。但是 Runnable 不会返回结果,并且无法抛出经过检查的异常。
Executors 类包含一些从其他普通形式转换成 Callable 类的实用方法。
简单说:就是实现这个类,并在唯一的call() 方法里面实现自己的业务逻辑。
- 接口 Future<V>
Future 表示异步计算的结果。它提供了检查计算是否完成的方法,以等待计算的完成,并获取计算的结果。计算完成后只能使用 get 方法来获取结果,如有必要,计算完成前可以阻塞此方法。取消则由 cancel 方法来执行。还提供了其他方法,以确定任务是正常完成还是被取消了。一旦计算完成,就不能再取消计算。如果为了可取消性而使用 Future 但又不提供可用的结果,则可以声明 Future<?> 形式类型、并返回 null 作为底层任务的结果。
简单说:该接口可以获取一个线程的结果。调用get的时候,如果结果没有计算完成,则阻塞。
示例场景描述: 下面示例讲的是,使用Callable任务类task,里面执行的内容是,外面传递进来什么就返回什么,其中使用随眠来模拟运算时间。然后把创建好的callable交给执行器执行。获得future对象,然后用future.get() 来获取结果。
可以看到上面的运行结果,在我们把task交给执行器执行的时候,的确是以线程的方式在运行了。等待全部任务结束后,能获取到正确的返回结果。
如果更改程序Task类,增加红色方框内异常语句:
如果我们把上面的异常打开,就能看到就算程序抛出了异常,但是在不调用get() 之前是不会抛出异常的。然后 任务完成状态却和jdk说明一致,是true。