[英]How can I interrupt a thread created from within a method?
我知道您可以中断从一个可运行类创建的线程,但是如何中断从方法创建的线程? 使用易失性布尔值对我不起作用,因此我认为有更好的方法可以做到这一点,或者我需要以某种方式中断它。 我不想中断所有线程,仅此一个。
我创建了一个启动Thread的方法,如下所示:
public static void StartSyncThread() {
new Thread() {
public void run() {
isRunning = true; // Set to true so while loop will start
while (isRunning) {
...
}
} // Close run()
}.start();
}
....
public static void KillSyncThread() {
isRunning = false;
}
如果保留对该线程的引用:
private static Thread myThread;
public static void StartSyncThread() {
myThread = new Thread() {
public void run() {
while (!Thread.currentThread().isInterrupted()) {
...
}
} // Close run()
}
myThread.start();
}
那你可以打电话
public static void killSyncThread() {
if (myThread != null && myThread.isAlive()) {
myThread.interrupt();
}
}
取消它。 这样,您就可以摆脱静态的isRunning标志,interrupt()会设置与之等效的内置标志,另外它将唤醒线程从睡眠或等待状态。
如果您确实确实将变量声明为volatile,则其更新值应该在线程之间可见。 如果您正在测试的标志与您设置的标志不同,这可能是一个范围界定问题吗? 随着全球可变状态的出现,它似乎很快就会令人费解。 举一个小例子,并亲自验证设置标志或中断线程是否有效,然后您可以自信地找到真正的问题。
您的代码可能在调用KillSyncThread之前实际上不会启动线程。 如果是这种情况,则线程将isRunning设置为true,然后永远继续运行。 我将在启动线程之前将isRunning设置为true。
如果代码中的代码也无法停止
...
具有无限内循环或对阻塞函数(例如套接字读取)的调用。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.