Понимание параллелизма JavaJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Понимание параллелизма Java

Сообщение Anonymous »

Я изучаю параллелизм Java под капотом, прочитал несколько статей и видеороликов о Java, посвященных многопоточности и параллелизму, и просто не могу собрать их все воедино.
Вот вот суть того, что я понял на данный момент (пожалуйста, поправьте меня, если я ошибаюсь!):
  • ЦП имеет физическое ядро ​​и логическое ядро. Логическое ядро ​​по сути представляет собой физическое ядро ​​* количество потоков, которые могут выполняться на каждом ядре.
  • В Java используется модель запроса на поток, поэтому для каждого запроса потребуется 1 из этих логических ядер
  • li>
    Следовательно, если процессор имеет 8 логических ядер, jvm может запускать 8 процессов параллельно (не одновременно!)
  • Параллелизм называется процесс, в котором одно логическое ядро может обрабатывать несколько запросов; предположим, что запрос будет выполнять блокирующий вызов ввода-вывода, а не ждать вызова ввода-вывода, поток можно освободить и использовать для обработки другого запроса. вот что значит быть одновременно
Имея все это в виду
Теперь я думаю, именно здесь это сбивает с толку.
Предположим, у меня есть 8 логических ядер и сервер Spring Web MVC, который может принимать вызов API. В этом вызове API мы будем выполнять бесконечную операцию блокировки ввода-вывода
Значит ли это, что
  • Я могу нажать максимум 8 раз прежде чем другой запрос будет поставлен в очередь/отложен, поскольку все потоки используются?
Следующим будет улучшение Spring Web MVC, а не выполнение операцию ввода-вывода в основном потоке, я хочу сделать это неблокирующим способом. это означает, что я создам новый поток для каждого вызова API. Означает ли это, что
  • Я могу нажать максимум 4 раза, прежде чем другой запрос будет поставлен в очередь/задержан, поскольку все потоки используются? (4 основных потока, 4 из блокирующего вызова ввода-вывода)
Дальнейший шаг вместо выполнения вызова ввода-вывода в новом потоке в режиме блокировки я теперь буду использовать CompletableFuture/Future, чтобы он был асинхронным и неблокирующим.

Код: Выделить всё

x = CompletableFuture.supplyAsync(() -> {
// Long I/O call
})
// do some operation
x.join();
Мой вопрос здесь будет:
  • После части SupplyAsync процесс будет продолжаться до тех пор, пока мы перейдите в x.join(); во время ожидания x.join() поток будет блокироваться? или поток освободится и произойдет переключение контекста, чтобы поток можно было использовать для обслуживания другого запроса?
Если ответ на вопрос номер 3 будет ли поток блокироваться, не означает ли это, что единственное отличие от вызова блокировки ввода-вывода нового потока (см. второе улучшение) состоит в том, что когда мы используем completableFuture, мы можем // выполнить некоторую операцию перед вызовом блокировки?
Что касается вопроса номер 3, я предполагаю, что как только мы доберемся до блокирующей части кода (.get() для Future / .join() completableFuture) поток будет освобожден и сможет обработать другой запрос.
Примечание: извините за мой плохой английский!

Подробнее здесь: https://stackoverflow.com/questions/784 ... oncurrency
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»