Добрый день. Собственно вопрос в заголовке. Допустим такую ситуацию
public class MyTask extends Task<Void> { @Override protected Void call() { while (true) { System.out.println("Начало"); if (isCancelled()) continue; synchronized (this) { try { this.wait();//Допустим, что откуда-то будет вызываться notify } catch (InterruptedException ignored) { } } System.out.println("Конец"); } } }
Потом, делаем так
{ MyTask mt = new MyTask(); Thread t = new Thread(mt); t.start(); mt.cancel(); }
На 4 строке мы вызываем метод cancel() и в нашем классе MyTask будет отработан блок catch и напишет “Конец”. Но, т.к. мы в бесконечном цикле, мы пойдём на 2-ой заход и вот тут уже проблема. Получается, что мы попадём в первую условную конструкцию и вернёмся к началу цикла, т.к. этот объект действительно будет cancelled, и так бесконечно. Вот как мне это isCancelled сделать false в блоке catch, isCancelled если что метод унаследованный от Task.