我知道你可以中断从一个runnable类创建的线程,但是如何中断我从一个方法创建的这个线程呢?使用volatile布尔值并不适合我,所以我假设有更好的方法来做到这一点,或者我需要以某种方式中断它。我不想打断所有线程,只是这个。
我创建了一个像这样启动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;
}
答案 0 :(得分:1)
如果你保留对线程的引用:
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,那么它的更新值应该在线程中可见。可能这是一个范围问题,你测试的旗帜与你设置的旗帜不一样?在全球可变状态下,似乎很快就会出现错综复杂的情况。做一个小例子并自己验证设置标志或中断线程的工作原理,然后有了这个信心你可以找到真正的问题。
答案 1 :(得分:0)
在您调用KillSyncThread之前,您的代码可能无法实际启动该线程。如果是这种情况,则线程将isRunning设置为true,然后继续永久运行。我会在启动线程之前将isRunning设置为true。
如果
中的代码也无法停止...
具有无限内循环或对阻塞函数的调用,例如套接字读取。