ExecutorService не выполняет потоки параллельно при использовании Stream <Future> - PullRequest
0 голосов
/ 25 июня 2018

Я использую ExecutionService следующим образом:

    ExecutorService exe = Executors.newWorkStealingPool(parts.size());
    ...
    Stream<Future<String>> futures = parts.stream().map(part -> exe.submit(() -> processPartition(part)));
    ...
    String ret[] = futures.map(t -> {
        try {
            return t.get();
        } catch (InterruptedException | ExecutionException e) {
            throw new RuntimeException(e);
        }
    }).toArray(n -> new String[n]);

код внутри processPartition() выполняет только по одному за раз.

Что происходит?

1 Ответ

0 голосов
/ 25 июня 2018

Я потратил несколько часов на устранение неполадок, а затем, наконец, нашел ответ через 2 минуты после публикации.

Проблема заключается в следующем:

Stream<Future<String>> futures = [...]

При использовании потока каждое будущее являетсяне передается до тех пор, пока не будет вызван каждый соответствующий map(t ->.

FIX:

List<Future<String>> futures = [...] .collect(Collectors.toList());

Это заставит все потоки быть отправленными.

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