Почему кодер после использования parallelStream не выполняется? - PullRequest
0 голосов
/ 28 августа 2018

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

@PreDestroy
public void tearDown() {
    final int mapSize = eventStreamProcessorMap.size();
    LOG.info("There are {} subscriptions to be stopped!", mapSize);

    final long start = System.currentTimeMillis();
    LocalTime time = LocalTime.now();

    final AtomicInteger count = new AtomicInteger();
    eventStreamProcessorMap.entrySet().parallelStream().forEach(entry -> {
        final Subscription sub = entry.getKey();
        final StreamProcessor processor = entry.getValue();

        LOG.info("Attempting to stop subscription {} of {} with id {} at {}", count.incrementAndGet(), mapSize, sub.id(), LocalTime.now().format(formatter));

            LOG.info("Stopping processor...");
            processor.stop();
            LOG.info("Processor stopped.");

            LOG.info("Removing subscription...");
            eventStreamProcessorMap.remove(sub);
            LOG.info("Subscription {} removed.", sub.id());

        LOG.info("Finished stopping processor {} with subscription {} in ParallelStream at {}: ", processor, sub, LocalTime.now().format(formatter));
        LOG.info(String.format("Duration: %02d:%02d:%02d:%03d (hh:mm:ss:SSS)",
                TimeUnit.MILLISECONDS.toHours(System.currentTimeMillis() - start),
                TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis() - start)%60,
                TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - star0)%60,
                TimeUnit.MILLISECONDS.toMillis(System.currentTimeMillis() - start)%1000));
        LOG.info("--------------------------------------------------------------------------");
    });

    LOG.info("Helloooooooooooooo?????");
    LOG.info(String.format("Overall shutdown duration: %02d:%02d:%02d:%03d (hh:mm:ss:SSS)",
            TimeUnit.MILLISECONDS.toHours(System.currentTimeMillis() - start),
            TimeUnit.MILLISECONDS.toMinutes(System.currentTimeMillis() - start)%60,
            TimeUnit.MILLISECONDS.toSeconds(System.currentTimeMillis() - start)%60,
            TimeUnit.MILLISECONDS.toMillis(System.currentTimeMillis() - start)%1000));
    LOG.info("xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx");
}

Код после обработки ParallelsStream не выполняется:

LOG.info("Helloooooooooooooo?????");

никогда не появляется в журнале. Почему нет?

1 Ответ

0 голосов
/ 28 августа 2018

Это вызвано eventStreamProcessorMap.remove(sub); (который вы сейчас удалили из кода вместе с выполненным вами редактированием). Вы используете потоковый набор Map entrySet (eventStreamProcessorMap) и удаляете из него элементы - это недопустимо, поэтому вы получаете ConcurrentModificationException.

Если вы действительно хотите удалить во время итерации, используйте Iterator или map.entrySet().removeIf(x -> {...})

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