Почему остановка свингера останавливает его немедленно?

#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) в петле? так что отмена(ложь) действует как отмена(истина) для спящей части? в поисках подвоха, но не смог его найти 🙁