У меня возникли проблемы с пониманием того, как я должен остановить работающий поток. Я постараюсь объяснить это на примере. Предположим, следующий класс:
public class MyThread extends Thread {
protected volatile boolean running = true;
public void run() {
while (running) {
synchronized (someObject) {
while (someObject.someCondition() == false && running) {
try {
someObject.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// do something useful with someObject
}
}
}
public void halt() {
running = false;
interrupt();
}
}
Предположим, что поток работает, и следующий оператор оценивается как true:
while (someObject.someCondition() == false && running)
Затем другой поток вызывает MyThread.halt (). Несмотря на то, что эта функция устанавливает для параметра «running» значение false (которое является логическим значением volatile) и прерывает поток, следующий оператор все еще выполняется:
someObject.wait();
У нас тупик. Поток никогда не будет остановлен.
Тогда я придумал это, но я не уверен, правильно ли это:
public class MyThread extends Thread {
protected volatile boolean running = true;
public void run() {
while (running) {
synchronized (someObject) {
while (someObject.someCondition() == false && running) {
try {
someObject.wait();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
// do something useful with someObject
}
}
}
public void halt() {
running = false;
synchronized(someObject) {
interrupt();
}
}
}
Это правильно? Это самый распространенный способ сделать это?
Это кажется очевидным вопросом, но я не могу найти решение. Большое спасибо за вашу помощь.