Как я могу прервать поток, созданный из метода?
Я знаю, что вы можете прервать поток, созданный, скажем, из запускаемого класса, но как я могу прервать этот поток, который я создал из метода? Использование энергозависимого логического значения не работает для меня, поэтому я предполагаю, что или есть лучший способ сделать это, или мне нужно как-то прервать его. Я не хочу прерывать все темы, только этот.
Я создал метод, который запускает поток, как это:
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;
}
2 ответа
Если вы сохраните ссылку на тему:
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, прежде чем запускать поток.
Он также не сможет остановиться, если код в
...
имеет либо бесконечный внутренний цикл, либо вызов функции блокировки, такой как чтение из сокета.