我试图查看是否有可能shutdownNow()一个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?

提前致谢。

最佳答案

答案很简单,您只需要仔细阅读invokeAll的Javadoc:


  执行给定的任务,并在所有任务完成时返回保存其状态和结果的期货列表。


(强调我的)。

换句话说,您的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;
  }
}


毫不奇怪,现在它的行为与您期望的一样。

09-26 05:40