【问题标题】:Why should I do Future.cancel() if I get InterruptedException when doing Future.get()如果在执行 Future.get() 时遇到 InterruptedException,我为什么要执行 Future.cancel()
【发布时间】:2015-08-13 11:28:08
【问题描述】:

Java Concurrency in Practice (Brian Goetz) 中有说明(重点是我的):

Future.get 抛出 InterruptedExcetion 或 TimeoutException 并且您知道程序不再需要结果时,使用 Future.cancel 取消任务

Future.get 的 Javadoc 声明(突出显示是我的):

抛出 InterruptedException - 如果当前线程在等待时被中断

所以,据我了解:如果我收到 InterruptedException,那么我的任务还没有开始(因为正在执行的线程在等待时被中断)。那我为什么要取消我的任务呢?

【问题讨论】:

  • 如果任务开始,然后正在等待一些资源,然后它被中断了怎么办?
  • 也许我读错了 javadoc。似乎这意味着线程正在等待任务启动。或者也许我在这里错了。
  • 那么,“等待”是否意味着执行线程在我的任务代码中的任何阻塞调用中被阻塞?

标签: java multithreading concurrency


【解决方案1】:

等待

抛出 InterruptedException - 如果当前线程在等待时被中断

表示当前正在运行的线程(执行Future.get() 的线程)正在等待Future.get() 返回。一般来说,当一个线程等待时,就像等待获取explicit lockObject.wait()BlockingQueue 中的阻塞方法一样。

现在关于书中的引述:如果您当前的线程被中断(因此InterruptedException)并且您将其解释为突然取消,那么您可能不再关心未来会返回什么,所以应该停止任何事情未来会。

所以当你告诉线程尚未启动时你就错了。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-09-10
    • 1970-01-01
    • 2020-11-28
    • 2019-06-16
    • 2016-10-07
    • 2016-04-30
    相关资源
    最近更新 更多