ScheduledFuture
Overview
- is a delayed result-bearing action, 可以被cancel.
- 通常是在ScheduledExecutorService里面schedule一个task, 然后ScheduledFuture是其task执行接受后的返回结果。
Code Analysis
- 继承于两个接口: extends Delayed, Future
- 一些继承chain
- interface Delayed extends Comparable, Comparable 就是底。
- Future 接口就是底。
- 关于Future 接口
- Future其实代表的是异步计算的一个结果。
- Future下面的方法也是为了check该异步计算是否完成,或者等待其完成;或者获取该计算结果。
- 要想知道异步计算是否完成,或者正在blocking, 只能通过 get 方法获取。
- Cancel 方法是当你想要cancel该异步计算时可以调用的一个方法。
- 除了上面提到的方法,其他方法则是用作判定该task是否正常完成或者被cancel了。
- 当异步计算task完成后,是不可以再被cancel的。
- 如果你想使用Future的cancel功能,但却不能提供一个usable result, 你可以指定Future<?>的 type, 并且返回null作为
- 内存一致性影响:线程A异步计算的结果,如果线程B调用了future.get方法之后,是可以访问在线程A中异步计算过程中修改的共享数据和其结果的。
- Methods
- boolean cancel(boolean mayInterruptIfRunning);
- 这一方法的目标是cancle对应的 task的执行, 不管该task是否已经启动都是可以调用这个方法的。
- 如果此方法调用成功,则随后你再怎么调用isDone() or isCancelled(),结果都会返回true.
- boolean isCancelled();
- 如果一个task在未完成之前被cancle了,则此方法返回true.
- boolean isDone();
- 如果task完成,则此方法返回true; 不管该task是正常完成,还是被cancel, or even throw exception了。
- V get() throws InterruptedException, ExecutionException;
- 该方法被调用后,会一直等待该task完成。然后返回该task执行完后的结果。
- V get(long timeout, TimeUnit unit);
- 参数timeout规定了等待时间,如果等待时间到了,则不再等待。这样就意味着返回结果不一定是完成异步计算后的结果,如果完成,则返回结果为异步计算的结果;否则返回的结果并不是异步计算的结果。