Параллельный поток не похож на работу параллельно, полностью - PullRequest
2 голосов
/ 12 апреля 2019

1.Set ParallelsStream не использует достаточное количество потоков.

Java8 parallelStream не работает точно параллельно.На моем компьютере набор java8 parallelStream не использует достаточное количество потоков, когда число задач меньше, чем число процессоров.

public class ParallelStreamSplitTest {
    @Test
    public void setStreamParallelTest() {
        System.out.printf("Total processor count : %d \n", Runtime.getRuntime().availableProcessors());
        long start = System.currentTimeMillis();
        IntStream.range(1, 8).boxed().collect(Collectors.toCollection(HashSet::new)).parallelStream().forEach((index) -> {
            System.out.println("Starting " + Thread.currentThread().getName() + ",    index=" + index + ", " + new Date());
            try {
                Thread.sleep(1000);
            } catch (Exception e) {
            }
        });
        long end = System.currentTimeMillis();
        System.out.println(Thread.currentThread().getName() + "'s elapsed time : " + (end - start));
    }

    @Test
    public void intStreamParallelTest() {
        System.out.printf("Total processor count : %d \n", Runtime.getRuntime().availableProcessors());
        long start = System.currentTimeMillis();
        IntStream.range(1, 8).parallel().forEach(index -> {
            System.out.println("Starting " + Thread.currentThread().getName() + ",    index=" + index + ", " + new Date());
            try {
                Thread.sleep(1000);
            } catch (InterruptedException e) {
            }
        });
        long end = System.currentTimeMillis();
        System.out.println(Thread.currentThread().getName() + "'s elapsed time : " + (end - start));
    }
}

В моем коде setStreamParallelTest занимает 4 секунды, тогда как intStreamParallelTest занимает 1 секунду.

Я ожидаю, что setStreamParallelTest также выполняется за 1 секунду.Это ошибка?

2.Можно ли использовать параллельный поток для вызова другого API в веб-приложении?Если это неправильно, почему?

Моему веб-приложению необходимо параллельно вызывать другой сервер API.Поэтому я использую параллельный поток для вызова API.

Sets.newHashSet(api1, api2, api3, api4).parallelStream().forEach(api -> callApiSync(api))

Я думаю, что все запросы, привязанные к моему серверу, разделяют пул разветвления.Итак, это выглядит опасно, когда один из ответов API медленный.

Это правильно?

1 Ответ

0 голосов
/ 12 апреля 2019

Контракт для parallelStream гласит:

Возвращает возможно параллельный поток с этой коллекцией в качестве источника.Для этого метода допустимо возвращать последовательный поток.

Если вы хотите вызывать несколько задач параллельно, используйте ExecutorService.

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