gpt4 book ai didi

java - 在 Thread 上调用 interrupt(),但它从未被中断

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:35:04 26 4
gpt4 key购买 nike

我编写了 VideoProcessor 类,它对视频进行一些繁重的处理。如果为“started”,则创建一个新线程并将引用保存在 videoProcessingThread 字段中。现在的问题是:

videoProcessingThread.interrupt();

这似乎没有任何效果,因为 isInterrupted() 永远不会计算为真。我还添加了其他中断检查,只是为了确定;但他们也不“工作”。我已经实现了一个解决方法:

videoProcessingThread.kill();

这似乎实际上“杀死”了线程。方法 kill 将 boolean 变量 kill 设置为 true 并且它被正确评估并且 Thread 返回。

videoProcessingThread = new Thread() {
boolean kill = false; // workaround

public void run() {
// init stuff
while (currentFrameIndex < totalFrames) {
if (isInterrupted()) {
System.out.println("isInterrupted");

return;
}
if (Thread.interrupted()) {
System.out.println("interrupted");

return;
}
if (Thread.currentThread().isInterrupted()) {
System.out.println("Thread.currentThread().isInterrupted()");

return;
}
if (kill) {
System.out.println("killed");

return;
}
}
// heavy processing
}

public void kill() {
kill = true;
}
}

我做错了什么?

最佳答案

首先,调用interrupt()可能并没有真正设置中断状态,请看here in javadocs确切的条件,有时它只会抛出一个 InterruptedException

其次,实际调用interrupted()方法除了返回中断状态外,还会清除中断状态,所以下一次调用isInterrupted()(仅返回当前状态,但不清除它)可能无法达到您的预期。

使用 boolean 变量可能是实现此目的的不错方法。你可以阅读this article其中详细说明了当您尝试中断线程时到底发生了什么,以及如何或多或少地可靠地进行中断。

关于java - 在 Thread 上调用 interrupt(),但它从未被中断,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8959937/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com