当前位置: 首页 > 知识库问答 >
问题:

导致无法取消任务的其他原因是什么?

潘嘉颖
2023-03-14

" boolean cancel(boolean mayInterruptIfRunning)尝试取消此任务的执行。如果任务已经完成、已经取消或由于其他原因无法取消,此尝试将会失败

https://docs.oracle.com/javase/7/docs/api/java/util/concurrent/Future.html#cancel(布尔值)

除了上面列出的原因之外,还有什么其他原因会无法取消任务?此外,如果任务运行如下代码,它可以被取消吗?

while(true)
{
;
}

共有3个答案

陈浩
2023-03-14

每个线程都有一个保存中断状态的特殊标志,可通过< code>isInterrupted()方法访问。当有人中断线程时,该标志被设置为< code>true。仅此而已。在该线程执行的代码检查该标志并抛出< code > interrupted exception 或退出线程执行之前,不会发生真正的中断。

标准库中许多旨在阻止当前线程的方法实际上会不时检查此标志,并在发现标志设置时抛出InterruptedException。例如,Thread.sleep()Thread.join()Object.wait()Lock.lockInterruptibly()和许多其他方法。因此,当您的线程定期显式检查此标志或被某些隐式检查它的描述方法阻止时,它是可中断的。否则,它不是。

因此,具有空循环的线程无法中断,因为它不检查中断状态。但是添加中断状态检查可以修复它:

while (!Thread.currentThread().isInterrupted()) { }

调用响应中断的方法也可以:

try {
    while (true) {
        Thread.sleep(timeout);
    }
} catch(InterruptedException e) {
    // Do nothing, just let the thread exit
}
傅毅然
2023-03-14

实际上,在Java中没有好的方法来终止一个线程。你基本上可以告诉一个线程停止,但是这个线程可能一直在等待,从来没有机会读取这个标志或者类似的问题。这实际上是一个复杂的问题。所以我假设他们只是说“某个问题”。

曾嘉福
2023-03-14

您发布的while循环将是不可取消代码的一个示例,因为它不会响应中断。

阻止侦听套接字的代码也可能无法处理中断。即使代码因InterruptedIOException而超时,如果您在没有设置中断标志的情况下接受异常,那么代码可能无法处理中断。

所以TLDR: 1)阻止IO的代码,2)不知道中断如何工作的代码。或者两者的组合。

 类似资料:
  • C# 10 / .NET 6 / System.Text.Json 我正在使用一个作为JSON响应返回的API。我正在尝试使用将JSON响应反序列化为一个类。我收到了一个JsonException,可以帮助理解我做错了什么。 我调用API并存储JSON响应:< code > string json = await Retreive。Fetch(目标); 下面是< code >控制台的输出。Writ

  • null null null 禁用Javascript确实改变了行为,我们看到请求仍然被取消,但没有看到它像启用Javascript时那样重新加载原始页面。 其他意见: 单击Chrome DevTools设备模拟中的链接不会导致取消请求,只会直接使用设备。

  • 我想在不使用IDE的情况下执行我的程序。我已经创建了一个jar文件和一个可执行的jar文件。当我双击exe jar文件时,什么也没有发生,当我尝试在cmd中使用命令时,它给出以下信息: 我使用命令:java-jar Calculator.jar 我是如何创建jar的: 右键单击项目文件夹(计算器) 选择 单击Java文件夹并选择可执行罐文件,然后选择下一个 启动配置:主-计算器 创建出口目的地 命

  • 我是如何创建罐子的: 右键单击项目文件夹(计算器) 选择 单击Java文件夹并选择“Exectuable Jar文件”,然后选择Next 启动配置:main-calculator 创建导出目标 打“完”获利!嗯,也不是。

  • minecraft 1.8.8的modcoderpack918中的有一个很大的问题。我的Java版本是1.8.0_271-B09。 我不知道我必须做什么。

  • 我有一个使用Libgdx游戏引擎的Android游戏。我有一个Android活动(mAndroidLauncher),它扩展了Libgdx的AndroidApplication类。有一种方法可以创建Android警报对话框: 我在Google Play开发人员控制台中遇到了如下问题: 这是我的应用程序中唯一使用AlertDialog的地方,这就是为什么我确信这是导致崩溃的方法。为什么RUNNUIT