Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Многопоточная обработка элементов ArrayList / 21 сообщений из 21, страница 1 из 1
10.09.2018, 12:17
    #39700348
fplab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная обработка элементов ArrayList
Доброго дня!

Есть класс, представляющий собой адрес (хост + порт), сообщение (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
10.09.2018, 12:20
    #39700351
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная обработка элементов ArrayList
fplab
Код: java
1.
                catch (ExecutionException ex) {}


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

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

Немного странный выбор размера пула. Основную часть веремени отправки занимает передача по сети. Поэтому эффективных потоков может быть на много больше чем ядер процессора.
Да я по всякому пробовал, честно говоря. Специально ограничивал размер списка отправляемых сообщений. Один черт - результат тот же: не печатает
...
Рейтинг: 0 / 0
10.09.2018, 12:43
    #39700365
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная обработка элементов ArrayList
Ну, так а что там с пошаговой отладкой? messages пустой? futures пустой? Почему везде перебор по индексу как в школе вместо стрима или хотя бы foreach?
...
Рейтинг: 0 / 0
10.09.2018, 12:47
    #39700366
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная обработка элементов ArrayList
Почему используется CompletionService, но не используются его методы?
...
Рейтинг: 0 / 0
10.09.2018, 12:49
    #39700368
fplab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная обработка элементов ArrayList
BlazkowiczНу, так а что там с пошаговой отладкой? messages пустой? futures пустой? Почему везде перебор по индексу как в школе вместо стрима или хотя бы foreach?
Пошагово все отлично. messages и futures - не пустые. Перебор по индексу, т.к. java 7.
Вот что-то смутно вспоминается мне такой "зверек" как CompletableFuture.
...
Рейтинг: 0 / 0
10.09.2018, 12:50
    #39700370
fplab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная обработка элементов ArrayList
BlazkowiczПочему используется CompletionService, но не используются его методы?
Пните, пожалуйста, в направлении примера (если есть). Проект свалился неожиданно - пришлось срочно переключаться и не получается войти в поток :)
...
Рейтинг: 0 / 0
10.09.2018, 13:49
    #39700413
Petro123
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная обработка элементов ArrayList
fplabПните, пожалуйста, в направлении примера
Лог примера с айдишниками потоков.
...
Рейтинг: 0 / 0
10.09.2018, 14:05
    #39700424
fplab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная обработка элементов ArrayList
Надо послать 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
10.09.2018, 19:46
    #39700634
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная обработка элементов ArrayList
Судя по логу в пуле всего 4 потока.
...
Рейтинг: 0 / 0
11.09.2018, 08:31
    #39700723
fplab
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Многопоточная обработка элементов ArrayList
mayton,

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


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


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