CompletableFuture runAsync против новой темы - PullRequest
0 голосов
/ 03 июля 2018

Контекст: я прочитал этот ТАК обсуждающий различия между CompletableFuture и Thread.

Но я пытаюсь понять , когда следует использовать новый Thread () вместо runAsync ().

Я понимаю, что runAsyn () более эффективен для коротких / одноразовых параллельных задач, потому что моя программа может избежать накладных расходов на создание нового потока, но стоит ли мне также учитывать это для длительных операций?

Какие факторы я должен знать, прежде чем рассмотреть возможность использования одного над другим?

Спасибо всем.

Ответы [ 2 ]

0 голосов
/ 03 июля 2018

Разница между использованием низкоуровневых API-интерфейсов параллелизма (таких как Thread) и других заключается не только в том виде работы, который вы хотите выполнить, но и в модели программирования, а также в том, насколько легко они настраивают ее. среда, в которой выполняется задача.

В общем случае рекомендуется использовать API более высокого уровня, например CompletableFuture, вместо непосредственного использования Thread s.

Я понимаю, что runAsyn () более эффективен для коротких / одноразовых параллельных задач

Ну, может быть, если вы звоните runAsync, рассчитывая на то, что он будет использовать пул fork-join. Метод runAsync перегружен методом, позволяющим указать java.util.concurrent.Executor, с которым выполняется асинхронная задача.

Использование ExecutorService для большего контроля над пулом потоков и использование CompletableFuture.runAsync или CompletableFuture.supplyAsync с указанной службой исполнителя (или нет) обычно предпочтительнее, чем создание и запуск объекта Thread напрямую.

Нет ничего особенно за или против использования API CompletableFuture для долгосрочных задач. Но выбор, который вы выбираете для использования Thread s, имеет и другие последствия, среди которых:

  • CompletableFuture дает лучший API для программирования в реактивном режиме, не заставляя нас писать явный код синхронизации. (мы не получаем это при непосредственном использовании потоков)
  • Интерфейс Future (который реализуется CompletableFuture) дает другие дополнительные очевидные преимущества.

Итак, вкратце: вы можете (и, вероятно, должны, если рассматривается альтернатива Thread API), использовать CompletableFuture API для ваших долгосрочных задач. Чтобы лучше управлять пулами потоков, вы можете объединить их с сервисами executor.

0 голосов
/ 03 июля 2018

Основным отличием является CompletableFuture запускать задачу по умолчанию на ForkJoinPool.commonPool. Но если вы создадите свой собственный поток и запустите его, он будет выполняться как отдельный поток, а не в пуле потоков. Также, если вы хотите выполнить некоторую задачу в последовательности, но asynchronously. Тогда вы можете сделать, как показано ниже.

    CompletableFuture.runAsync(() -> {
        System.out.println("On first task");
        System.out.println("Thread : " + Thread.currentThread());
    }).thenRun(() -> {
        System.out.println("On second task");
    });

Выход:

On first task
Thread : Thread[ForkJoinPool.commonPool-worker-1,5,main]
On second task

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

Примечание: Threads - это демон в ForkJoinPool.commonPool.

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