Последствия создания нескольких Runnable с общими объектами? - PullRequest
1 голос
/ 23 марта 2019

У меня есть программа, которая предназначена для многопоточности. У меня есть класс ProcessRunnable, который обрабатывает данные с большим количеством операций ввода-вывода. Все классы ProcessRunnable выполняются в отдельных потоках, но создаются с помощью общих экземпляров классов client / util.

Пример:

Client client = new Client();
Util util = new Util();

List<Runnable> runnables = new ArrayList<>();

for (int i; i < THREAD_COUNT; i++) {
    runnables.add(ProcessRunnable
                       .builder()
                       .client(client)
                       .util(util)
                       .build());
}

runnables.forEach(runnable -> new Thread(runnable).start());

Мне любопытно, является ли повторное использование одних и тех же классов в runnables блокирующим поведением и, по сути, приводит к тому, что моя программа становится однопоточной?

1 Ответ

2 голосов
/ 23 марта 2019

Здесь:

runnable -> new Thread(runnable).start()

Ключевым моментом, который делает ваш код многопоточным, является то, что вы вызываете метод start () ваших потоковых объектов. Если бы вы просто вызвали метод run класса потока, то вы фактически получили бы «включающий» поток, выполняющий всю работу.

Наконец, обратите внимание, что использование «голых» потоков напрямую не идеально. Об этом можно узнать, но Java предлагает важные абстракции, такие как ExecutorService, которые следует использовать вместо этого по разным причинам.

Основная причина, чтобы избежать необработанных потоков: вы должны контролировать все тонкие детали вручную. Сколько потоков следует использовать? Как насчет объединения и совместного использования потоков (создание потока сопряжено с большими накладными расходами, поэтому в реальном мире вы избегаете создания потоков для отдельных задач, которые затем выбрасывают их, как это делает ваш код). Помимо этого: как правило, вы хотите решить бизнес-проблему. Вы хотите использовать несколько потоков, чтобы предотвратить ситуации с горлышком бутылки. Пример: вы хотите делать несколько запросов по сети параллельно для получения и обработки данных. Тогда вы действительно заботитесь только о конечном результате, а не о тонкостях тонкости низкого уровня! Тогда вы, например, будете использовать объекты Future или CompleteableFuture.

Просто используйте поисковую систему и исследуйте эти термины, вы найдете много материала.

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