#java #multithreading #swingworker
Вопрос:
Я использую SwingWorker для выполнения некоторых повторяющихся задач в фоновом режиме. Это мой класс:
public class CMyThread {
private SwingWorker<Object, Void> taskWorker;
public volatile boolean threadDone = false;
public CMyThread() {
}
@Override
public void stop() {
taskWorker.cancel(true);
}
@Override
public void start() {
taskWorker = new SwingWorker<Object, Void>() {
@Override
public Object doInBackground() {
while (!isCancelled()) {
// SOMETHING TIMECONSUMING THAT NEEDS TO BE DONE REPEATEDLY
CUtils.sleep(10000);
}
threadDone = true;
return null;
}
@Override
public void done() {
}
};
taskWorker.execute();
}
public void waitThreadToGentlyFinish() { // called when we call destroy() on the servlet
while (!threadDone) {
System.out.print("#");
CUtils.sleep(200);
}
}
}
И это называется так:
CMyThread myThread = new CMyThread();
myThread.start();
Теперь, в какой-то момент я хочу мягко остановить нить.
Поэтому я звоню
myThread.stop();
myThread.waitThreadToGentlyFinish();
Я ожидаю, что для завершения текущего [ДЕЙСТВИЯ] потребуется время, только тогда оно выйдет из цикла и установит флаг «threadDone» в значение true. но на самом деле я вижу, что он немедленно выходит из цикла, и я никогда не вижу отображаемых символов»#».
Очевидно, что в моем коде что-то не так, но я не вижу очевидного. Есть идеи, ребята ?
Комментарии:
1. БОЖЕ мой! и вот что очевидно. Большое спасибо ! отмена(ложь) делает работу намного лучше. Теперь я задаюсь вопросом, как справиться с долгим сном в цикле. Давайте представим, что процесс представляет собой ежедневное пакетное задание со сном ~23 часа (рассчитано). Есть ли способ сообщить об отмене(ложь) для реальной задачи, но за исключением длительного сна?
2. кстати, я не понял, когда вы говорите «вызов get() в done ()»… что получится() ? ваши другие комментарии в порядке. start() и stop() существуют, потому что в моем реальном коде класс реализует интерфейс с этими 2 методами, и да, CUtils.sleep() делает то, что вы ожидали.
3. Чисто ! спасибо за объяснение. Как бы вы справились со сном(23*24*60*1000) в петле? так что отмена(ложь) действует как отмена(истина) для спящей части? в поисках подвоха, но не смог его найти 🙁