2013-07-24 2 views
1

Я пытаюсь выяснить, возможно ли shutdownNow() ExecutorService, у которого все еще есть задачи в исполнении.О shutdownNow of ExecutorService

public static void main (String []args) throws InterruptedException 
{ 
    ExecutorService exSer = Executors.newFixedThreadPool(4); 

    List<ExecutorThing> lista = new ArrayList<>(); 
lista.add(new ExecutorThing()); 
lista.add(new ExecutorThing()); 
lista.add(new ExecutorThing()); 
lista.add(new ExecutorThing()); 
lista.add(new ExecutorThing()); 

    List<Future<Object>> futureList = exSer.invokeAll(lista); 
    exSer.shutdownNow(); 

и класс ExecutorThing является следующее:

public class ExecutorThing implements Callable<Object>{ 
    public Object call() { 

     while (!(Thread.currentThread().isInterrupted())) 
     for (int i=0;i<1;i++) 
     { 
      System.out.println(Thread.currentThread().getName()); 
     } 
      return null; 
     } 
} 

Интересно, почему он никогда не останавливается, даже если я проверить флаг прерывания ... и shutdownNow должны прекратить задачи с помощью interrupt().

Где я ошибаюсь?

Заранее спасибо.

PS в this вопрос, который они предлагают в качестве решения, то же самое, что я использовал, однако это не работает для меня. Может быть, потому, что я использую invokeAll?

Заранее спасибо.

ответ

2

Ответ довольно прост, вам просто нужно внимательно прочитать Javadoc из invokeAll:

выполняет поставленные задачи, возвращая список фьючерсов, имеющих свой статус и приводит , когда весь комплект.

(выделено мной).

Другими словами, ваш shutdownNow никогда не будет выполнен. Я изменил ваш код на это:

public class Test { 
    public static void main (String []args) throws InterruptedException 
    { 
    ExecutorService exSer = Executors.newFixedThreadPool(4); 
    exSer.submit(new ExecutorThing()); 
    exSer.submit(new ExecutorThing()); 
    exSer.submit(new ExecutorThing()); 
    exSer.submit(new ExecutorThing()); 
    exSer.shutdownNow(); 
    } 
} 

class ExecutorThing implements Callable<Object> { 
    public Object call() throws InterruptedException { 
    while (!(currentThread().isInterrupted())) 
     System.out.println(currentThread().isInterrupted()); 
    return null; 
    } 
} 

Неудивительно, что теперь он ведет себя так, как вы ожидаете.