我试图查看是否有可能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;
}
}
毫不奇怪,现在它的行为与您期望的一样。