我正在阅读Java EE docs,我在方法mayInterruptIfRunning
中了解cancel(boolean mayInterruptIfRunning)
参数的用途时遇到了一些问题。我从文档中得知,该参数用于通知会话用户试图取消调用,因此SessionContext.wasCancelled()
方法应该返回true(如果mayInterruptIfRunning
设置为true),即使取消失败。如果它是正确的,那么以下问题的答案是什么:
1)什么时候有人会在mayInterruptIfRunning
参数设置为false的情况下调用cancel方法,这意味着什么?
2)方法SessionContext.wasCancelled()
和Future<v>.isCancelled()
的结果有何不同?我是对的,如果取消失败,第二次返回错误,而第一次返回true,即使取消失败,只要已将mayInterruptIfRunning
设置为真?
更新
基于答案,我想提出这个问题:
假设有人使用参数Future.cancel()
调用mayInterruptIfRunning
方法为false。任务何时取消,何时取消?它取决于什么因素?
如果在上述情况下取消(成功),SessionContext.wasCancelled()
将返回false,而Futute.isCancelled()
是否为真?
答案 0 :(得分:0)
1)什么时候有人用mayInterruptIfRunning调用cancel方法 参数设置为false,这意味着什么?
当你尝试到cancel异步调用时,你不确定究竟是什么状态 服务器端方法是。该方法可能仍在等待执行, 也许它已被执行或已经开始。
参数mayInterruptIfRunning
对最后一种情况很有用。
但是,只有在服务器端实现了一些特殊逻辑才有意义,
我的意思是,如果你检查SessionContext.wasCanceled()
方法的状态。
只是一个例子:
//code that execuete in the asynchronus service
while (myCondition) {
doSomething();
if (mySessionCtx.wasCancelCalled())
break;
}
如果方法正在执行,并且您使用cancel()
调用mayInterruptIfRunning = false
,则循环将不会终止,直到myCondition为false。
如果参数为true,则while循环将被中断。
请注意,moment cancel()
不会中断线程执行。
2)来自SessionContext.wasCancelled()方法的结果有什么不同 和Future.isCancelled()?
如上所述,SessionContext.wasCancelled()
用于服务器端,而Future<V>.isCancelled()
用于服务器端
在客户端用于确定任务是否被取消。