Поток застревает при использовании явного пула потоков - PullRequest
0 голосов
/ 28 мая 2020

Я определил пул потоков, подобный этому, в классе конфигурации

    @Configuration
    public class AsyncTaskExecutePool{
        @Bean(name = "homepageThreadPoolExecutor")
        public Executor getAsyncExecutor() {
            ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
            executor.setCorePoolSize(80);
            executor.setMaxPoolSize(200);
            executor.setQueueCapacity(2000);
            executor.setThreadNamePrefix("PE-");
            executor.initialize();
            return executor;
        }
    }

Он потребляется классом обслуживания, использующим этот

    @Qualifier("homepageThreadPoolExecutor")
    private Executor existingThreadPool;

Теперь метод, который его использует, и где используется пользовательский пул потоков.

    public List<TestObject> getContent(List<TestObject> testList, HomepageRequest homePageRequest) {
        try {
            List<CompletableFuture<TestObject>> getProcessedList = testList.stream()
                    .map(n -> CompletableFuture.supplyAsync(
                            () -> processorFacade.getServiceType(n)
                                    .process(homePageRequest, n), existingThreadPool))
                    .collect(Collectors.toList());
            CompletableFuture<Void> allFutures = CompletableFuture
                    .allOf(getProcessedList.toArray(new CompletableFuture[getProcessedList.size()]));
            CompletableFuture<List<TestObject>> allCompletableFuture =
                    allFutures.thenApply(future -> getProcessedList
                            .stream()
                            .map(CompletableFuture::join)
                            .collect(Collectors.toList()));
            return allCompletableFuture.get();
        } catch (InterruptedException | ExecutionException e) {
            logger.error("Error While Getting Content from getContent and Exception is {} ", e);
            Thread.currentThread().interrupt();
            return new ArrayList<>();
        }
    }

Теперь проблема: когда я запускаю интеграционный тест для получения содержимого, он застревает, и поток находится в состоянии ожидания. getProcessedList не заполняется. Но в то же время, если я не передаю явный поток потоков в CompletableFuture, он работает нормально. В чем может быть причина?

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