Java 为什么shutdownNow()在被调用之前工作?

Java 为什么shutdownNow()在被调用之前工作?,java,Java,您能帮助我理解Java中的shutdownNow()方法吗。 我有一个简单的代码:它在一个循环中启动10个线程并打印它们的名称。 它还有shutdownNow()方法,但由于for循环在shutdown()之上,我认为应该完成for循环,然后调用shutdownNow() 正如我们所看到的,它不是那样工作的。我总是得到相同的结果:循环完成一半,然后调用shutdownNow()。 为什么会这样 public class Solution { public static void main

您能帮助我理解Java中的shutdownNow()方法吗。 我有一个简单的代码:它在一个循环中启动10个线程并打印它们的名称。 它还有shutdownNow()方法,但由于for循环在shutdown()之上,我认为应该完成for循环,然后调用shutdownNow()

正如我们所看到的,它不是那样工作的。我总是得到相同的结果:循环完成一半,然后调用shutdownNow()。 为什么会这样

public class Solution {
    public static void main(String[] args) throws InterruptedException {
        ExecutorService executor = Executors.newFixedThreadPool(5);
        for (int i = 1; i <= 10; i++) {
            final int localId = i;
            executor.submit(() -> doExpensiveOperation(localId));
        }
        executor.shutdownNow();



    }

    private static void doExpensiveOperation(int localId) {
        System.out.println(Thread.currentThread().getName() + ", localId=" + localId);
    }
}
公共类解决方案{
公共静态void main(字符串[]args)引发InterruptedException{
ExecutorService executor=Executors.newFixedThreadPool(5);
对于(int i=1;i不进行昂贵的操作(localId));
}
执行者。关机现在();
}
私有静态void doExpensiveOperation(int localId){
System.out.println(Thread.currentThread().getName()+”,localId=“+localId”);
}
}

昂贵的操作是异步执行的,这就是ExecutorService的全部要点。因此,一旦您将所有任务提交给服务,调用方法将继续,并且将调用shutdownNow方法


如果您想同步运行for循环中的所有方法调用,只需删除ExecutorService的用法并直接调用该方法。

您阅读了for的javadoc吗?它解释了你观察到的行为。此外,请解释您期望的行为,以便我们可以为您提供替代方案(如果存在此类替代方案)。