Подтвердить что ты не робот

Есть ли разница между concurrency и parallelism в java?

Я занимаюсь некоторыми исследованиями в Google и не могу полностью разглядеть различия (если есть) между параллельными и параллельными программами в Java. Некоторая информация, которую я рассмотрел, не предполагает различий между ними. Это так?

4b9b3361

Ответ 1

Это зависит от того, кто его определяет. Люди, которые создали язык программирования Go код вызова Concurrent, если он разбит на части, которые можно обрабатывать параллельно, тогда как Parallelism подразумевает что эти части фактически работают в одно и то же время.

Поскольку это принципы программирования, язык программирования не влияет на то, как они определены. Тем не менее, Java 8 будет иметь больше возможностей для включения как concurrency, так и Parallelism, не слишком сильно злоупотребляя вашим кодом. Например, код выглядит следующим образом:

List<Integer> coolItemIds = new List<Integer>();
for(Item item : getItems())
{
    if(item.isCool())
    {
        int itemId = item.getId();
        coolItemIds.add(item);
    }
}

... который является неконкурентным и непараллельным, может быть написан так (мой синтаксис, вероятно, неверен, но, надеюсь, вы получите эту идею):

Iterable<Item> items = getItems();
Iterable<Item> coolItems = items.filter(item -> item.isCool());
Iterable<Integer> coolItemIds = coolItems.map(item -> item.getId());

Вышеуказанный код записывается одновременно: ни один из указанных кодов не требует, чтобы файлы coolItems были отфильтрованы по одному, или что вы можете вызывать только getId() только по одному элементу за раз, или даже если элементы в начале списка необходимо отфильтровать или отобразить перед элементами в конце. В зависимости от того, какой тип Iterable возвращается из getItems(), данные операции могут выполняться или не выполняться параллельно, но код, который вы написали, является параллельным.

Также интересует:

Ответ 2

Я полагаю, это зависит от ваших определений, но мое понимание выглядит примерно так:

  • Concurrency относится к вещам, происходящим в некотором неуказанном порядке. Многозадачность - выполнение нескольких программ с помощью команд чередования через временную привязку - хороший способ подумать об этом смысле concurrency.
  • Parallelism (или "true" parallelism) относится к тому, что происходит буквально в одно и то же время. Для этого требуется аппаратная поддержка (сопроцессоры, многоядерные процессоры, сетевые машины и т.д.). Все parallelism являются параллельными, но не все concurrency являются параллельными.

Насколько мне известно, ни один из этих терминов не является специфичным для Java или имеет какие-либо специфические для Java нюансы.

Ответ 3

Параллелизация (или Parallelism или параллельные вычисления) представляет собой форму вычисления, при которой выполняется много вычислений одновременно. По сути, если проблему с интенсивным процессором можно разделить на более мелкие независимые задачи, то эти задачи могут быть назначены различным процессорам.

Concurrency - это больше о многозадачности, которая выполняет множество действий, но не требует проблем с ЦП.

Ответ 4

Я не думаю, что эти два термина имеют четко определенные значения. Они - оба понятия искусства, а не технические термины.

Тем самым, как я их интерпретирую, это то, что что-то происходит параллельно, если это можно сделать одновременно с другими вещами и параллельно, если это может быть сделано несколькими потоками одновременно. Я использую это использование в основном из документации по сборке мусора JVM, в которой говорится о таких вещах, как

параллельный маркер развертки, также известный как коллектив параллельный, или CMS, предназначен для приложений, чувствительных к паузам сбора мусора. Он выполняет большинство операций по сбору мусора одновременно, то есть в то время как потоки приложений работают

и

Коллекционер CMS теперь использует несколько потоков для выполнения задачи параллельной маркировки в параллельной на платформах с несколькими процессорами.

По общему признанию, это очень специфический контекст, и, вероятно, неразумно его обобщать.

Ответ 5

Если вы программируете использование потоков (параллельное программирование), это не обязательно будет выполняться как таковое (параллельное выполнение), так как оно зависит от того, может ли машина обрабатывать несколько потоков.

Вот визуальный пример. Нитки на безпоточной машине:

         --  --  --
      /              \
 >---- --  --  --  -- ---->>

Резьбы на резьбовой машине:

       ------
      /      \
  >-------------->>

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

Пожалуйста, обратитесь к В чем разница между параллельным программированием и параллельным программированием?

Ответ 6

Из документации oracle страница:

В многопоточном процессе на одном процессоре процессор может переключать ресурсы выполнения между потоками, что приводит к параллельному выполнению.

В том же многопоточном процессе в среде с общей памятью с несколькими процессорами t каждый поток процесса может выполняться одновременно на отдельном процессоре, что приводит к параллельному выполнению > .

Когда процесс имеет меньше или столько потоков, сколько есть процессоров, система поддержки потоков в сочетании с операционной средой гарантирует, что каждый поток работает на другом процессоре.

Java SE 7 улучшила параллельную обработку, добавив ForkJoinPool API.

Подробнее см. ниже:

Параллельное программирование с потоками в Java (специфично для Java)

Concurrency vs Parallelism - В чем разница? (Language agnostic)

Ответ 7

Параллельность - это архитектурный шаблон проектирования, который позволяет запускать сразу несколько операций (которые могут не выполняться параллельно).

В случае одноядерного выполнения таких операций параллелизм может быть "имитирован", например, путем переключения контекста (если ваш язык программирования использует потоки для параллельного выполнения).

Допустим, у вас есть два потока, в одном из которых вы ставите задания. Второе ожидание до тех пор, пока не будет создана какая-либо работа, и выберет ее для выполнения. Несмотря на использование одноядерного процессора, оба они работают и обмениваются данными (через очередь).

Это одновременное выполнение - даже потоки выполняются последовательно на одном ядре (совместно используют его).


Параллельная версия того же упражнения будет выглядеть схожим с одной разницей:

Выполнение потоков будет происходить на многоядерном процессоре. Нитки будут работать параллельно друг другу, а не последовательно (каждый на своем собственном ядре).