Как ScheduledExecutorService обрабатывает завершенные потоки? - PullRequest
1 голос
/ 04 июня 2019

Обрабатывает ли ScheduledExecutorService обработку завершенного потока и создает новый?

В приведенном ниже примере, если какой-либо из моих потоков завершается из-за Error, что происходит с размером пула потоков?

Во время отладки я мог заметить, что один из потоков, созданных этой службой, был молча прерван без печати какого-либо оператора журнала. Проверяя дамп потока, я все еще мог видеть, что 32 потока все еще были там, и ни один из них не был заблокирован.

public class CacheManager
{

    private static class CacheRefresher extends Thread
    {
        Cache cache; 

        public CacheRefresher(Cache cache)
        {
            this(cache);
        }

        @Override
        public final void run()
        {

            try {
                LOG.info("cache is getting refreshed for " + cache.type);
                cache.refreshCache();
            } catch (Exception e) {
                String subject = "Cache refresh failed in BMW";
                LOG.log(Level.WARN, subject + ". Exception thrown:", e);
            }
        }       
    }

    public void refreshCaches(List<cache> caches)
    {
        ThreadFactory ourThreadFactory =
                new NamedThreadFactory("CacheHandler", true);

        ScheduledExecutorService scheduleService =
                Executors.newScheduledThreadPool(32, ourThreadFactory);
        initialDelay = 60;
        for (Cache cache : caches) {  
            service.scheduleWithFixedDelay(new CacheRefresher(cache), initialDelay, 20, TimeUnit.SECONDS);
            initialDelay += 2;
            cacheContainers.add(cache);
        }
    }
}

Ответы [ 3 ]

2 голосов
/ 04 июня 2019

В то время как JavaDocs для Executors.newFixedThreadPool прямо упоминают это:

Если какой-либо поток завершается из-за сбоя во время выполнения до завершения работы, новый будет занимать его место, если это необходимо для выполнения последующих задач. Потоки в пуле будут существовать до тех пор, пока он не будет явно отключен.

нет такой строгой гарантии относительно Executors.newScheduledThreadPool .

Возможно, что в этом отношении он ведет себя одинаково, но это деталь реализации, о которой вам не нужно беспокоиться. Служба Executor предоставит / создаст достаточно потоков для выполнения поставленных задач.

2 голосов
/ 04 июня 2019

Неопределенные исключения в запланированных задачах не приведут к завершению потоков планировщика. Однако это предотвратит перепланирование сбойной задачи. См. Соответствующую документацию для ScheduledThreadPoolExecutor.html # scheduleWithFixedDelay :

Последовательность выполнения задач продолжается бесконечно, пока не произойдет одно из следующих исключительных завершений:

  • [...]

  • При выполнении задачи возникает исключение. В этом случае вызов get для возвращенного будущего вызовет исключение ExecutionException, в качестве причины которого будет использовано исключение.

1 голос
/ 04 июня 2019

Как указано в Javadoc newScheduledThreadPool (int) всегда будет указанное количество потоков.Даже если поток отключится, будет запущен другой. Но, во-первых, потоки в ScheduledExecutorService должны быть повторно использованы, даже если исключение происходит в Runnable.run().

И убедитесь, что потоки не заблокированы, но ожидают новыхдействие, чтобы сделать ...

...