Java之Future(cancel,iSDone)

前言

在学习Future接口的过程中,注意到它具有一个cancel()方法,用于取消异步的任务,它传入一个boolean类型的参数,传入true会中断线程停止任务,而传入false则会让线程正常执行至完成,并返回false。 
由此让我产生了疑问,false参数并不会停止任务,那么cancel(false)有什么用呢?

Future简介

Future接口用于获取异步计算的结果,可通过get()获取结果、cancel()取消、isDone()判断是否完成等操作。

  • V get(): 获取结果,若无结果会阻塞至异步计算完成
  • V get(long timeOut, TimeUnit unit):获取结果,超时返回null
  • boolean isDone():执行结束(完成/取消/异常)返回true
  • boolean isCancelled():任务完成前被取消返回true
  • boolean cancel(boolean mayInterruptRunning):取消任务,未开始或已完成返回false,参数表示是否中断执行中的线程

cancel()中的false参数

如上面所介绍的,传入true会中断线程停止任务,传入false则会让线程正常执行至完成,刚开始我难以理解传入false的作用,既然不会中断线程,那么这个cancel方法不就没有意义了吗?后来查阅了许多资料,在stackoverflow上找到了一个比较好的解释,终于恍然大悟。

简单来说,传入false参数只能取消还没有开始的任务,若任务已经开始了,就任由其运行下去。

当创建了Future实例,任务可能有以下三种状态:

  • 等待状态。此时调用cancel()方法不管传入true还是false都会标记为取消,任务依然保存在任务队列中,但当轮到此任务运行时会直接跳过。
  • 完成状态。此时cancel()不会起任何作用,因为任务已经完成了。
  • 运行中。此时传入true会中断正在执行的任务,传入false则不会中断。

总结

Future.cancel(true)适用于: 
1. 长时间处于运行的任务,并且能够处理interruption

Future.cancel(false)适用于: 
1. 未能处理interruption的任务 
2. 不清楚任务是否支持取消 
3. 需要等待已经开始的任务执行完成

猜你喜欢

转载自blog.csdn.net/u014252478/article/details/82109694
今日推荐