Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java “TimeoutException”和“CancellationException”之间的差异`_Java_Multithreading_Executorservice - Fatal编程技术网

Java “TimeoutException”和“CancellationException”之间的差异`

Java “TimeoutException”和“CancellationException”之间的差异`,java,multithreading,executorservice,Java,Multithreading,Executorservice,据Javadoc说,, 抛出TimeoutException和CancellationException以及另外两个异常 TimeoutException和CancellationException之间有什么区别 据我所知,CancellationException在线程超时时抛出,因此执行器取消了它。但是什么时候抛出TimeoutException? 是否存在超时线程超时而未取消的情况 锯和敲别人 蒂亚 //--------------- 更新 除非开发人员明确地调用,否则没有人调用Futur

据Javadoc说,, 抛出
TimeoutException
CancellationException
以及另外两个异常

TimeoutException
CancellationException
之间有什么区别

据我所知,
CancellationException
在线程超时时抛出,因此执行器取消了它。但是什么时候抛出
TimeoutException
? 是否存在超时线程超时而未取消的情况

锯和敲别人

蒂亚

//---------------

更新

除非开发人员明确地调用,否则没有人调用Future.cancel()

没有提到任何关于它引起的
CancellationException

我有一个代码进入系统,由于特定的时间限制,我可能不得不取消该代码。但是,我必须能够知道
Future.cancel()
何时返回true,因为任务已完成或已取消。
从表面上看,
Future.cancel()
在这两种情况下都返回true
Future.isDone()
或其任何其他方法都没有帮助

CancellationException在取消任务时通过调用引发

当您要求
get()
等待结果的给定时间时,会引发TimeoutException,并且生成结果所需的时间超过该时间


线程不会超时。执行者不会取消线程。

当任务被取消时,通过调用将引发CancellationException

当您要求
get()
等待结果的给定时间时,会引发TimeoutException,并且生成结果所需的时间超过该时间

线程不会超时。执行器不会取消线程

据我所知,
CancellationException
在线程超时时抛出,因此执行器取消了它

否。
CancellationException
如果在任务完成之前调用了
Future
cancel()
方法,并且随后调用了它的
get()
方法,则会引发
异常

但是什么时候抛出TimeoutException呢

TimeoutException
(不是
CancellationException
)是由
Future引发的。如果指定的时间未完成任务,则获取(long,Timeunit)

是否存在超时线程超时而未取消的情况

对。超时与取消完全不是一回事


关于更新:

除非开发人员明确地调用,否则没有人调用Future.cancel()

只有对所讨论的特定
未来
有引用的人才能调用其
cancel()
方法。如果您的意思是这样的话,
ExecutorService
不会调用它,特别是超时与取消不同,因此不会导致
CancellationException
s

javadoc没有提到由它引起的
CancellationException

Future.cancel()
的Javadoc没有提到它,我也不认为有这样做的特殊需要。解释它的意义,以及那些
Future
方法的javadocs,它们可以将它抛出它们所做的文档

我有一个代码进入系统,由于特定的时间限制,我可能不得不取消该代码

因此,听起来您将调用两个参数版本的
Future.get()
,以指定时间限制,然后在超时的情况下(由
TimeoutException
发出信号),您将调用
Future.cancel()

但是,我必须能够知道
Future.cancel()
何时返回
true
,因为任务已完成或已取消。从表面上看,
Future.cancel()
在这两种情况下都返回true

你从哪里得到的?您自己引用的
Future.cancel()
的文档表示该方法返回

false
如果任务无法取消,通常是因为它已经正常完成<代码>真值否则

因此,如果
Future.cancel()
方法将抛出
取消异常
。如果它还没有启动,那么它永远不会启动;如果它已经启动,那么它就会被中断

后一种选择要求将
true
传递给
Future.cancel()
,在这种情况下,任务实际停止取决于其实现对其线程被中断的响应。如果任务没有实际停止运行,则取消正在进行的任务是否被视为成功尚不清楚;这实际上可能取决于实现

据我所知,
CancellationException
在线程超时时抛出,因此执行器取消了它

否。
CancellationException
如果在任务完成之前调用了
Future
cancel()
方法,并且随后调用了它的
get()
方法,则会引发
异常

但是什么时候抛出TimeoutException呢

TimeoutException
(不是
CancellationException
)是由
Future引发的。如果指定的时间未完成任务,则获取(long,Timeunit)

是否存在超时线程超时而未取消的情况

对。超时与取消完全不是一回事


关于
// keep running until we are interrupted
while (!Thread.currentThread.isInterrupted()) {
    ...
}