我已经使用shutdownNow在第一个进程从invokeAny方法提供了一些输出之后立即关闭了进程。但是在输出中,即使调用shutDownNow(),我也可以看到进程正在完成并完成其工作,然后才关闭。
码:
int numberOfRecordsInsertedSuccessfully = 0;
List<String> userRecordList = readFile(
"C:\\Users\\sonar\\git\\MultiThreading-Cocurrency\\JavaSEConcurrencyAPIStudyProject\\src\\main\\java\\Resources\\ExecutorServiceUserFile.txt");
// ExecutorService executorService = Executors.newSingleThreadExecutor(); //Thread pool of single thread.
// ExecutorService executorService = Executors.newFixedThreadPool(3); //Thread pool size is 3 here
ExecutorService executorService = Executors.newCachedThreadPool();
UserDao userDao = new UserDao();
List<Callable<Integer>> listOfCallable= new ArrayList<>();
userRecordList.forEach(x -> listOfCallable.add(new UserProcessor(x, userDao)));
try {
Integer future = executorService.invokeAny(listOfCallable);
System.out.println(future);
} catch (InterruptedException | ExecutionException e) {
e.printStackTrace();
}
System.out.println(executorService.shutdownNow());
System.out.println("ExecutorService is shutting down " + executorService.isShutdown()); //After getting first future result this statement will be executed.
System.out.println("ExecutorService is Terminated " + executorService.isTerminated());
控制台上的输出为:
有关代码的更多详细信息,请参考上面的git链接,
类别:ExecutorServiceThreeTypesOfShutDownMethodMainClass
软件包:com.Concurrency.JavaSEConcurrencyAPIStudyProject.HighLevelApis.ExecutorServiceInterface
要使用的项目:JavaSEConcurrencyAPIStudyProject
git链接:Git link for project for more details
请帮忙,为什么会这样?我该如何解决这个问题?
最佳答案
该方法的Javadoc表示以下内容:
除了尽最大努力阻止停止处理正在执行的任务之外,没有任何保证。例如,典型的实现将通过Thread.interrupt()取消,因此任何无法响应中断的任务都可能永远不会终止。
https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html
因此,如果您的任务不检查中断的标志并捕获并忽略InterruptedException
,则shutdownNow()
将无法停止它们
关于java - 来自executorService界面的ShutdownNow不会关闭正在执行的任务,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/61308952/