java.util.concurrent.Future<V>

原创
2014/06/20 00:47
阅读数 529

其实刚开始接触Future的同学都会觉得这个Future不太好理解,为什么较这么个名字?理解了之后会发现,实在是太贴切了。

上源代码

package java.util.concurrent;

public interface Future<V> {

    boolean cancel(boolean mayInterruptIfRunning);

    boolean isCancelled();

    boolean isDone();

    V get() throws InterruptedException, ExecutionException;

    V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;
}


boolean cancel(boolean mayInterruptIfRunning);

boolean cancel(boolean mayInterruptIfRunning);

参数:mayInterruptIfRunning, 是否需要执行中断?

  • True:如果线程在执行过程中,那么Interrupt

  • False:如果线程在执行过程中,那么等待

返回:任务是否被取消了

  • True:任务被取消了

  • False:任务无法被取消,那么可能任务不响应Interrupt或者其他原因无法取消,或者任务已经完成

解读:老实说这个接口的设计不是非常好, 不如搞成cancel() 和 cancelNow()

  • 理解起来非常拗口和难记

  • 实现的时候,会因为这个参数,做很多ifelse逻辑,中断和等待的两种策略将实现在同一个实现方法


boolean isCancelled();

boolean isCancelled();

返回:当任务在完成前被取消那么返回True, 否则未能取消或者已经完成,返回False

描述:未能取消和已经完成,用了同一个返回。这两个在业务场景下,大部分是对立的。这个返回比较蛋疼。


boolean isDone();

boolean isDone();

返回:任务是否已经完成。

解读:一个返回结果对应一个状态,这种方法的设计会比较好。


V get() throws InterruptedException, ExecutionException;

V get() throws InterruptedException, ExecutionException;

返回:具体的计算结果。

异常:

  • InterruptedExcetpion:任务被中止

  • ExecutionException:执行过程中的异常

解读:会等待一直到返回结果为止,除非被异常打断,如果一直不出结果,别把自己等死了。


V get(long timeout, TimeUnit unit) throws InterruptedException, ExecutionException, TimeoutException

V get(long timeout, TimeUnit unit)
        throws InterruptedException, ExecutionException, TimeoutException;

参数:等待时间

返回:具体的计算结果

异常:

  • InterruptedExcetpion:任务被中止

  • ExecutionException:执行过程中的异

  • TimeoutException:等待超时

解读:等不到,我就抛异常。你不爱我,我就报复社会?


个人觉得Future的接口设计,略有瑕疵


Future表示了一个异步计算的结果,还记得Callable(点击查看源码)吗?一个异步计算的过程。一个是过程,一个是结果,既然是异步结果,现在当然不能拿到返回,将来才有结果,所以就叫Future嘛。

展开阅读全文
加载中
点击加入讨论🔥(2) 发布并加入讨论🔥
打赏
2 评论
1 收藏
0
分享
返回顶部
顶部