2012-06-23 2 views
1

Какой правильный способ прервать поток исполнителей? Я получил это: класс Thread с именем Worker с методом:Как прервать поток исполнителей

public void run() { 
    while(!(Thread.currentThread().isInterrupted()){ 
     System.out.println("work " + Thread.currentThread().getName() + ":" + Thread.currentThread().isInterrupted()); 
    } 
} 

И главный класс с:

ExecutorService executorService = Executors.newFixedThreadPool(threadCount); 
Worker worker = new Worker();     
executorService.execute(worker); 

Я пытаюсь вызвать worker.interrupt(); или executorService.shutdownNow(); но мой поток идет и isInterrupted () является ложным.

+0

Проверьте это, какие может быть возможным дублированием http://stackoverflow.com/questions/7142665/why-does-thread-isinterrupted-always-return-false – GETah

ответ

1

Можете ли вы опубликовать все соответствующие коды? Основываясь на информации, которую вы указали, я не могу воспроизвести описанное вами поведение. См ниже SSCCE, который работает, как ожидалось - выход:

работы бассейна 1-токарно-1: ложные
работы бассейна 1-токарно-1: ложные
работы бассейна 1-токарно-1: ложный
....
тема была прервана

Код:

public class Test { 

    public static void main(String[] args) throws InterruptedException { 
     ExecutorService executorService = Executors.newFixedThreadPool(1); 
     Worker worker = new Worker(); 
     executorService.execute(worker); 
     executorService.shutdownNow(); 
    } 

    public static class Worker extends Thread { 

     public void run() { 
      while (!Thread.currentThread().isInterrupted()) { 
       System.out.println("work " + Thread.currentThread().getName() + ":" + Thread.currentThread().isInterrupted()); 
      } 
      System.out.println("Thread has been interrupted"); 
     } 
    } 
} 
+0

Благодарим за ответ. Ваш код работает нормально, отличие от моего, что в классе Worker в методе запуска я работаю с JMS. Только одна строка 'messageService.sendMessage (message);' Если я его комментирую, потоки останавливаются, если не всегда 'work pool-1-thread-1: false'. И я могу остановить поток только с моим собственным флагом, а не isInterrupted() – user1406196

+0

Возможно, потому что этот метод блокирует ... – assylias

Смежные вопросы