ShutdownNow из интерфейса executorService не закрывает задачу в процессе - PullRequest
0 голосов
/ 19 апреля 2020

Я использовал 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());

Вывод на консоль: enter image description here

Более подробную информацию о коде см. Выше git ссылка с

Класс: ExecutorServiceThreeTypesOfShutDownMethodMainClass

пакет: com.Concurrency.JavaSEConcurrencyAPIStudyProject.HighLevelApis.ExecutorServiceInterface

1014 * * * 234 * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *. проект для более подробной информации

Пожалуйста, помогите, почему это происходит? как я могу решить эту проблему?

1 Ответ

1 голос
/ 20 апреля 2020

Javado c для этого метода говорит следующее:

Нет никаких гарантий, кроме попыток изо всех сил прекратить обработку активно выполняющихся задач. Например, типичные реализации будут отменены через Thread.interrupt (), поэтому любая задача, которая не отвечает на прерывания, может никогда не завершиться.

https://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ExecutorService.html

Так что если ваши задачи не проверяют прерванный флаг, а ловят и игнорируют InterruptedException, тогда shutdownNow() не сможет их остановить

...