Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Java [игнор отключен] [закрыт для гостей] / Цикл и асинхронные запросы / 17 сообщений из 17, страница 1 из 1
18.07.2012, 10:14:19
    #37883191
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
Есть цикл от 1 до N
Некоторые шаги посылают запрос на сервер и по ответу, надо сделать действия. Те которые не посылают, либо по-умолчанию либо ничего. Очередность ответов разная - 5 может придти быстрее чем 2 образно говоря.

Вопрос - как узнать, что пришли все ответы и дальше вызвать нужный метод обработки данных
...
Рейтинг: 0 / 0
18.07.2012, 10:15:12
    #37883192
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
-=Koba=-Есть цикл от 1 до N
Некоторые шаги посылают запрос на сервер и по ответу, надо сделать действия. Те которые не посылают, либо по-умолчанию либо ничего. Очередность ответов разная - 5 может придти быстрее чем 2 образно говоря.

Вопрос - как узнать, что пришли все ответы и дальше вызвать нужный метод обработки данных

Цикл тут for, но могут быть совершенно разные
...
Рейтинг: 0 / 0
18.07.2012, 10:35:55
    #37883230
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
Ну, накапливать ответы в буфер.
...
Рейтинг: 0 / 0
18.07.2012, 10:44:33
    #37883244
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
BlazkowiczНу, накапливать ответы в буфер.
И сколько копить их?
И как узнать, что все накопилось?

Образно
Код: java
1.
2.
sendAllData(); //цикл посылающий запросы
preparedData(); //должен вызвать когда пришли все ответы



Можно конечно анализ проводить в самом ответе, но...
...
Рейтинг: 0 / 0
18.07.2012, 10:51:21
    #37883256
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
Приблизительно вот так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
void runLoop(){
for(...){
  sendAsync();
  expectedResponses++;
}

synchronized(buffer){
  while(buffer.size() <= expectedResponses){
    buffer.wait();
  }
}

process(buffer);

}


void onAsyncResponse(Response r){
  synchronized(buffer){
    buffer.add(r);
  }
 buffer.notifyAll();
}
...
Рейтинг: 0 / 0
18.07.2012, 10:59:37
    #37883279
-=Koba=-
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
BlazkowiczПриблизительно вот так
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
void runLoop(){
for(...){
  sendAsync();
  expectedResponses++;
}

synchronized(buffer){
  while(buffer.size() <= expectedResponses){
    buffer.wait();
  }
}

process(buffer);

}


void onAsyncResponse(Response r){
  synchronized(buffer){
    buffer.add(r);
  }
 buffer.notifyAll();
}



Ок идея понятна, спасибо сейчас опробую
...
Рейтинг: 0 / 0
18.07.2012, 11:00:31
    #37883284
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
только там = лишнее. должно быть просто <
...
Рейтинг: 0 / 0
18.07.2012, 11:02:04
    #37883289
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
И со скобками я промазал. notifyAll должен быть внутри synchronized блока.
...
Рейтинг: 0 / 0
18.07.2012, 11:34:29
    #37883354
schwa
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
...
Рейтинг: 0 / 0
18.07.2012, 13:00:06
    #37883578
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
Зачем wait/notify?
Есть же CyclicBarrier
...
Рейтинг: 0 / 0
18.07.2012, 13:04:03
    #37883591
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
Еще есть CountDownLatch . Может он лучше подойдет.
...
Рейтинг: 0 / 0
18.07.2012, 13:05:33
    #37883595
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
fixxerЗачем wait/notify?
Есть же CyclicBarrier
Не могу представить как его здесь прикрутить, да ещё и при условии, что кол-во асинхронных задач может быть меньше чем итераций в цикле.
...
Рейтинг: 0 / 0
18.07.2012, 13:09:32
    #37883605
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
Если нет требования обрабатывать результат в том же потоке, который инициирует цикл, то можно вообще через атомарный счетчик разрулить, так будет даже проще. Проблема только в том, чтобы дождаться конца цикла.
...
Рейтинг: 0 / 0
18.07.2012, 13:27:12
    #37883644
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
BlazkowiczfixxerЗачем wait/notify?
Есть же CyclicBarrier
Не могу представить как его здесь прикрутить, да ещё и при условии, что кол-во асинхронных задач может быть меньше чем итераций в цикле.

Да, скорее CountDownLatch подойдет

Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
new CountDownLatch(N);

void runLoop() {
for(1..N) {
  sendAsync();
}

latch.await();

void onAsyncResponse(Response r){
 latch.countDown();
}
...
Рейтинг: 0 / 0
18.07.2012, 13:35:41
    #37883666
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
fixxerДа, скорее CountDownLatch подойдет


Из постановки задачи N заранее не извесно:
Код: java
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
new CountDownLatch(N);

void runLoop() {
for(1..N) {
  if(condition) {
    sendAsync();
  }
}

latch.await();

void onAsyncResponse(Response r){
 latch.countDown();
}



Хотя это решается проходом в два раза, но всё же.
...
Рейтинг: 0 / 0
18.07.2012, 14:08:46
    #37883727
fixxer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
BlazkowiczfixxerДа, скорее CountDownLatch подойдет


Из постановки задачи N заранее не извесно:
Хотя это решается проходом в два раза, но всё же.

Известно максимальное значение N, этого достаточно. Если асинхронного запроса не нужно для шага, сразу делаем countDown().
...
Рейтинг: 0 / 0
18.07.2012, 14:26:56
    #37883774
Blazkowicz
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Цикл и асинхронные запросы
fixxerИзвестно максимальное значение N, этого достаточно. Если асинхронного запроса не нужно для шага, сразу делаем countDown().
Логично. Не подумал.
...
Рейтинг: 0 / 0
Форумы / Java [игнор отключен] [закрыт для гостей] / Цикл и асинхронные запросы / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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