powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Java [игнор отключен] [закрыт для гостей] / Многопоточная обработка элементов ArrayList
21 сообщений из 21, страница 1 из 1
Многопоточная обработка элементов ArrayList
    #39700348
fplab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Доброго дня!

Есть класс, представляющий собой адрес (хост + порт), сообщение (msg) и результат доставки сообщения (done):
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
public class Message {
    int id;
    String host;
    int port;
    String msg;
    boolean done;

    // Геттеры и сеттеры
    ...
}



В процессе работы формируется список таких сообщений, который необходимо доставить по адресам:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
                ...
                // Список сообщений для отправки
                List<Message> messages = createMessageList();
                int procNumber = Runtime.getRuntime().availableProcessors();
                ExecutorService executor = Executors.newFixedThreadPool(procNumber);
                CompletionService<Message> service = new ExecutorCompletionService<>(executor);
                List<Future<Message>> futures = new ArrayList<>(messages.size());

                for(int i = 0; i < messages.size(); i++) {
                    // Отправка; в классе MessageSender (implements Callable<Message>) открывается сокет, делается попытка отправки
                    // после чего устанавливается переменная done (успех/не успех)
                    futures.add(service.submit(new MessageSender(messages.get(i))));
                }

                // Размеры исходного списка (messages) и результирующего (futures) совпадают
                LOG.info("{} : {}", messages.size(), futures.size());

                // Теперь надо прочитать значение поля done - и тут облом
                try {
                    for (int i = 0; i < futures.size(); i++) {
                        Future<Message> f = futures.get(i);
                        Message m = f.get();
                        LOG.info("{} : {}", i, f.getDone());
                    }
                }
                catch (InterruptedException ex) {}
                catch (ExecutionException ex) {}



Все вроде ОК. Сообщения отправляются, результат выставляется (done = true/false), но распечатать я их не могу. Последний цикл проскакивает как будто печатать нечего, а на самом деле там может быть много элементов. Как сие победить? Спасибо
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700351
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fplab
Код: java
1.
                catch (ExecutionException ex) {}


Последний цикл проскакивает как будто печатать нечего
И, правда, удивительно.
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700352
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fplab int procNumber = Runtime.getRuntime().availableProcessors();
ExecutorService executor = Executors.newFixedThreadPool(procNumber);

Немного странный выбор размера пула. Основную часть веремени отправки занимает передача по сети. Поэтому эффективных потоков может быть на много больше чем ядер процессора.
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700354
fplab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowicz,
Спасибо, оценил :) Исправил. Исключений нет. Не печатается
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700356
fplab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Blazkowiczfplab int procNumber = Runtime.getRuntime().availableProcessors();
ExecutorService executor = Executors.newFixedThreadPool(procNumber);

Немного странный выбор размера пула. Основную часть веремени отправки занимает передача по сети. Поэтому эффективных потоков может быть на много больше чем ядер процессора.
Да я по всякому пробовал, честно говоря. Специально ограничивал размер списка отправляемых сообщений. Один черт - результат тот же: не печатает
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700365
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, так а что там с пошаговой отладкой? messages пустой? futures пустой? Почему везде перебор по индексу как в школе вместо стрима или хотя бы foreach?
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700366
Фотография Blazkowicz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Почему используется CompletionService, но не используются его методы?
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700368
fplab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczНу, так а что там с пошаговой отладкой? messages пустой? futures пустой? Почему везде перебор по индексу как в школе вместо стрима или хотя бы foreach?
Пошагово все отлично. messages и futures - не пустые. Перебор по индексу, т.к. java 7.
Вот что-то смутно вспоминается мне такой "зверек" как CompletableFuture.
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700370
fplab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BlazkowiczПочему используется CompletionService, но не используются его методы?
Пните, пожалуйста, в направлении примера (если есть). Проект свалился неожиданно - пришлось срочно переключаться и не получается войти в поток :)
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700413
Фотография Petro123
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fplabПните, пожалуйста, в направлении примера
Лог примера с айдишниками потоков.
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700424
fplab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо послать 398 сообщений. Часть отправляется, остальные висят.
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
2018-09-10 13:55:36.938  INFO 5344 --- [main]      : [MessagesHandler] send 398 new messages
2018-09-10 13:55:36.941  INFO 5344 --- [main]      : 398 : 398
2018-09-10 13:55:37.018  INFO 5344 --- [pool-1-thread-1]       : [MessagesSender] #L#861694031601733;NA
2018-09-10 13:55:37.098  INFO 5344 --- [pool-1-thread-1]       : [MessagesSender] #L#865733027402304;NA
2018-09-10 13:55:37.098  INFO 5344 --- [pool-1-thread-4]       : [MessagesSender] #L#865733027402304;NA
2018-09-10 13:55:37.098  INFO 5344 --- [pool-1-thread-3]       : [MessagesSender] #L#865733027370451;NA
2018-09-10 13:55:37.098  INFO 5344 --- [pool-1-thread-2]       : [MessagesSender] #L#865733027370451;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-1]       : [MessagesSender] #L#865733027402304;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-4]       : [MessagesSender] #L#865733027402304;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-3]       : [MessagesSender] #L#865733027402304;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-1]       : [MessagesSender] #L#865733027482421;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-4]       : [MessagesSender] #L#865733027482421;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-3]       : [MessagesSender] #L#865733027482421;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-2]       : [MessagesSender] #L#865733027402304;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-4]       : [MessagesSender] #L#866104026907793;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-3]       : [MessagesSender] #L#866104026907793;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-2]       : [MessagesSender] #L#866104027064917;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-4]       : [MessagesSender] #L#866104027064917;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-3]       : [MessagesSender] #L#866104027064917;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-2]       : [MessagesSender] #L#866104027065575;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-4]       : [MessagesSender] #L#866104027065575;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-3]       : [MessagesSender] #L#866104027065575;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-2]       : [MessagesSender] #L#866104027065575;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-4]       : [MessagesSender] #L#866104027066433;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-3]       : [MessagesSender] #L#866104027066433;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-2]       : [MessagesSender] #L#866104027066433;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-1]       : [MessagesSender] #L#866104026907793;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-2]       : [MessagesSender] #L#866104027069353;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-1]       : [MessagesSender] #L#866104027069353;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-2]       : [MessagesSender] #L#866104027070260;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-1]       : [MessagesSender] #L#866104027070260;NA
2018-09-10 13:55:37.100  INFO 5344 --- [pool-1-thread-2]       : [MessagesSender] #L#866104027070260;NA
2018-09-10 13:55:37.100  INFO 5344 --- [pool-1-thread-1]       : [MessagesSender] #L#866104027070260;NA
2018-09-10 13:55:37.100  INFO 5344 --- [pool-1-thread-2]       : [MessagesSender] #L#866104027070260;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-3]       : [MessagesSender] #L#866104027069353;NA
2018-09-10 13:55:37.099  INFO 5344 --- [pool-1-thread-4]       : [MessagesSender] #L#866104027069353;NA
2018-09-10 13:55:37.102  INFO 5344 --- [pool-1-thread-1]       : [MessagesSender] #L#866104029011874;NA
2018-09-10 13:55:37.102  INFO 5344 --- [pool-1-thread-2]       : [MessagesSender] #L#866104027070260;NA
2018-09-10 13:55:37.102  INFO 5344 --- [pool-1-thread-1]       : [MessagesSender] #L#866104029011874;NA
2018-09-10 13:55:37.102  INFO 5344 --- [pool-1-thread-4]       : [MessagesSender] #L#866104029011874;NA
2018-09-10 13:55:37.102  INFO 5344 --- [pool-1-thread-3]       : [MessagesSender] #L#866104029011874;NA
2018-09-10 13:55:37.102  INFO 5344 --- [pool-1-thread-2]       : [MessagesSender] #L#866104029011874;NA
2018-09-10 13:55:37.102  INFO 5344 --- [pool-1-thread-1]       : [MessagesSender] #L#866104029011874;NA


И все - после этого висит.

Вот код, который это выводит:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
                List<Message> messages = createMessageList();
                LOG.info("[MessagesHandler] send {} new messages", messages.size());

                ExecutorService threadPool = Executors.newFixedThreadPool(procNumber);
                CompletionService<Message> completionService = new ExecutorCompletionService<Message>(threadPool);
                ArrayList<Future<Message>> futures = new ArrayList<>();

                for(int i = 0; i < messages.size(); i++) {
                    futures.add(completionService.submit(new MessagesSender(messages.get(i))));
                }

                LOG.info("{} : {}", messages.size(), futures.size());

                int received = 0;

                while(received < ipsMessages.size()) {
                    try {
                        Future<Message> resultFuture = completionService.take();
                        Message message = resultFuture.get();
                        LOG.info("{}", message.getMsg());
                        received++;
                    }
                    catch (InterruptedException ex) {ex.toString();}
                    catch (ExecutionException ex) { ex.toString();}
                }
                threadPool.shutdown();
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700634
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Судя по логу в пуле всего 4 потока.
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700723
fplab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mayton,

Точно. Пробовал увеличить в 10 раз. Все равно проблема остается
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700728
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделай дамп потоков. Посмотрим чего они ждут.
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700827
Фотография Пылинка
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonСделай дамп потоков. Посмотрим чего они ждут.
Вот именно. Начинать нужно было с состояния сообщений - сколько дошло, хотя бы. У тебя второй "хвост" торчит (который ты нам, кстати, и не показал). "Первым делом на call посадить" заменить метод call() на более простой, скорее всего все заработает.
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39700924
ivanra
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: java
1.
2.
                    catch (InterruptedException ex) {ex.toString();}
                    catch (ExecutionException ex) { ex.toString();}


выход на бесконечный цикл при первой ошибке. Ну и сами ошибки игнорируются *(who cares)
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39701378
cossack5
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не проще ли написать messages.parallelStream().forEach (m-> sendMessage(m)) ?
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39702825
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
кстати, работает
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39702827
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cossack5Не проще ли написать messages.parallelStream().forEach (m-> sendMessage(m)) ?
Совет не полный без информации о том из какого пула потоков этот параллелизм берётся.
И что будет при одновременном использовании нескольких parallelStream().
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39702868
andreykaT
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
там же вроде есть какой то дефолтовый тредпулэкзекутор, расшаренный на всё приложение, и который можно чем-то заменить. правда, там синтаксис будет уже не такой ээээ лаконичный. не?
...
Рейтинг: 0 / 0
Многопоточная обработка элементов ArrayList
    #39702871
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Типа тово.
...
Рейтинг: 0 / 0
21 сообщений из 21, страница 1 из 1
Форумы / Java [игнор отключен] [закрыт для гостей] / Многопоточная обработка элементов ArrayList
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]