作者热门文章
- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我编写了 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/
安装并修复我的 VS2015 实例后,我仍然无法让智能感知(服务器端)在我的 MVC View 中工作。当我在 session 中第一次打开 .cshtml 文件并找到 Activitylog 文件时
我是一名优秀的程序员,十分优秀!