закрытие статически созданных executorservice блоков самостоятельно назначенных переменных? - PullRequest
0 голосов
/ 07 марта 2020

Мне просто интересно объяснение того, как этот код работает

предположим, что у нас есть Работа класс ниже

 public  class Work  {
    private static ThreadPoolExecutor executorService;

    private  Work(){};

    public static void instansiate(int numberOfThread){
        executorService= (ThreadPoolExecutor) Executors.newFixedThreadPool(numberOfThread);
    }

    public static void shutDown(){
        executorService.shutdown();
    }

    public static ExecutorService getExecutorService() {
        return executorService;
    }

    public static int getThreadCount(){
        return executorService.getCorePoolSize();
    }
}

и я вызываю этот класс где-то в методе, как ниже

 public static void xx() throws ExecutionException, InterruptedException {
    Work.instansiate(2);
    System.out.println("Thread count= " + Work.getThreadCount());
    ExecutorService executorService = Work.getExecutorService();
    Future<String> future1 = executorService.submit(new Callable<String>() {
        @Override
        public String call() throws Exception {
            return "future1";
        }
    });
    String resFuture1 = future1.get();
    System.out.println(resFuture1);
    Work.shutDown();
    Future<String> future2 = executorService.submit(new Callable<String>() {
        @Override
        public String call() throws Exception {
            return "future2";
        }
    });

    String resFuture2 = future2.get();
    System.out.println(resFuture2);

}

Этот код вызывает исключение после строки Work.shutDown () и говорит, что отклонено из java .util.concurrent. ThreadPoolExecutor@234bef66 [Завершено, размер пула = 0 , активные потоки = 0 ...

Я назначил Work.getExecutorService другому executorService, как закрытие Работа executorservice может заблокировать назначенный один.

1 Ответ

0 голосов
/ 07 марта 2020

На самом деле executorService содержит ту же ссылку, что и Work.executorService (), таким образом, это повлияло на закрытие executorservice Work.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...