Невозможно отменить запущенную задачу с SingleThreadExecutor - PullRequest
0 голосов
/ 28 апреля 2011

У меня есть класс, реализующий Runnable:

public class Abc implements Runnable{
    public synchronized void run(){
        while(!(Thread.currentThread().isInterrupted() || someCondition())){
           doSomething();
           try{
               this.wait(SOME_TIME);
           } catch(InterruptedException ex){
            logger.error("Ex",ex);
            Thread.currentThread.interrupt();
               }
}}}

После отправки его в пул потоков я хотел бы отменить его с прерыванием.

futureTask.cancel(true);

Но сегодня мой Runnable объект перестал получать прерывания. Я вышел из состояния прерывания: false. InterruptedException не брошено. Любые предложения, что не так?

Ответы [ 3 ]

1 голос
/ 28 апреля 2011

Я предполагаю, что прерывание было использовано doSomething или doSomething было связано (не возвращено)

Использование wait () в цикле, подобном этому, подсказывает мне, что у вас есть поток управления, который был бы лучшеподходит для использования библиотек параллелизма.Можете ли вы дать более подробную информацию о том, что вы ждете?

Кстати, если вы переместите try / cath за пределы цикла, это упростит его.

0 голосов
/ 09 мая 2011

Решено

Это было на самом деле очень сложное состояние гонки.Я начал задание из потока графического интерфейса и отменил его из потока сетевого ридера.Я не могу объяснить, почему log4j не отображал логгеры, но лучший контроль потока решил мою проблему.Ваши ответы помогли мне найти идею для ее решения, спасибо.

Когда что-то сработало вчера, но не сегодня - возможно, это состояние гонки или тупик.: -)

0 голосов
/ 28 апреля 2011

Сначала ваш фрагмент даже не компилируется: вам не хватает скобок, Thread.currentThread - это метод, а не переменная экземпляра. Затем вы вызываете Thread.interrupted () в вашем методе doSomething? Если да: очищает прерванное состояние потока, так что ожидание не будет прервано и currentThread (). IsInterrupted () вернет false.

Вам также не нужно перепроверять прерванное состояние в предложении while или повторно прерывать поток после его прерывания. Это выглядит лучше (и ловит исключение, которое может сделать ваш doSomething):

  public synchronized void run() {
    try {
      while (!someCondition()) {
        doSomething();
        wait(SOME_TIME);
      }
    } catch (InterruptedException ie) {
      logger.error(ie);
    } catch (Exception e) {
      logger.error(e);
    }
  }

@ Питер: пробуй и лови, хотя это определенно хорошее предложение!

...