![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: 3 Всего: 6 |
По ходу дела возник еще вопрос:
а как отловить таймаут в ожидании??? wait(timeout) генерит ексепшны # IllegalArgumentException # IllegalMonitorStateException # InterruptedException но это не туда... как быть? Чего я не учел? как мне определить, что было прерывание по таймауту??? -------------------- |
|||
|
||||
AntonSaburov |
|
|||
![]() Штурман ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 5658 Регистрация: 2.7.2002 Где: Санкт-Петербург Репутация: 51 Всего: 118 |
А почему должно быть прерывание по таймауту. Если просто истекло время - программа продолжит свое исполнение. И все. Т.е. отсутствие эксепшенов и есть признак, что таймаут кончился.
Если ошибаюсь - поправьте. |
|||
|
||||
Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: 3 Всего: 6 |
Скажем так: из объекта А я отправил запрос объекту Б, который работает с сокетом. Он в свою очередь удачно отправил запрос на сервер. Но я со стороны А ставлю условие, что ответ должен прийти не позднее чем через 3 сек. и ставлю таймаут.
Если нужный мне тип ответа придет - объект Б нотифицирует моего ожидающего А и он продолжит работу. Но если вылет по таймауту - я должен сигнализировать об ошибке. Вот такая ситуация... Я кстати уже нашел решение. ![]() Объект А: boolean a=false; lock.wait(timeOut) if(!a) { timeout error } Объект Б: if(received){ A.a=true; lock.notify() } что то типа такого... -------------------- |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
А лучсе всего использовать java.nio.* - он позволяет асинхронную работу с сокетами, что
гораздо эффективнее. -------------------- |
|||
|
||||
LSD |
|
|||
![]() Leprechaun Software Developer ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 15718 Регистрация: 24.3.2004 Где: Dublin Репутация: 210 Всего: 538 |
Alone решение правильное (я бы тоже так делал), только добавить синхронизацию и все.
-------------------- Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it. |
|||
|
||||
redrick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 547 Регистрация: 7.1.2004 Где: Москва Репутация: 3 Всего: 5 |
я вот подобную вещь видел сделанной немного по-другому... завтра попробую раскопать сорс и сказать как именно, но идея в том, что вокруг объекта Б делается класс типа TimeoutSocket, а он в случае таймаута кидает ексепшн, который и ловится...
-------------------- Имею Мнение Хрен Оспоришь |
|||
|
||||
Alone |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: 3 Всего: 6 |
Естественно с синхронизацией, я просто в примере не писал. ![]() Добавлено @ 09:57
Эффективнее по сравнению с чем? -------------------- |
||||
|
|||||
Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: 3 Всего: 6 |
Тут хитрость - в работе с сокетами... в данном случае с сокетом одновременно работают несколько объектов. каждый из них отправляет через сокет запросы. Когда что-то приходит на сокет - оно парсится и выполняется соответствующие вызова каких либо методов. вот тут никто никакой гарантии на временные интервалы дать не сможет. Пример 1. Объект "А" послал запрос сокету (Объект "Б") 2. Объект "С" тоже послал свой запрос "Б" "Б" взаимодействует с сервером 3. в "Б" возвращается ответ для "А" , который передается по сети 20сек 4. И о каком таймауте для сокета может идти речь ![]() Сокет "работает" честно... а вот данные пришли позднее чем были нужны ![]() Если сокет по какой либо "технической" причине не сможет принять / отправить данные , он сообщит через своего обработчика ошибок, и это будет ошибка сети ![]() Хух... заговорился... ![]() -------------------- |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
По сравнению с синхронным IO, то есть java.net.*, java.io.*. -------------------- |
|||
|
||||
Alone |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 663 Регистрация: 11.5.2003 Где: Dnepropetrovsk, U A Репутация: 3 Всего: 6 |
Гм... я почему то думал, что как раз наоборот, синхронные лучше/эффективнее асинхронных...
Где я неправ? -------------------- |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Синхронный IO означает, что поток должен ждать завершения действия
(например, подключения клиента). В это время ничего другого поток делать не может. Значит, нужно несколько потоков. В асинхронном такие операции не являются блокирующими, и поток может одновременно (почти ![]() Если нужен всего один поток, то это естественно, эффективнее, чем несколько потоков. -------------------- |
|||
|
||||
redrick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 547 Регистрация: 7.1.2004 Где: Москва Репутация: 3 Всего: 5 |
вот по этому поводу
интересна такая вещь : это реализуется внутри самого потока ? т. е. это ведь возможно только если один объект знает о нескольких потоках, которые он обслуживает (скажем сокет соединяется с несколькими серверами). Я по роду деятельности сталкивался с асинхронным API в .NET - там есть beginInvoke(), который отправляет запрос на сервер и выдает вам хендел hr, вы делаете что хотите и когда закончили и вам понадобились данные вызываете endInvoke(hr), который либо выдает данные, либо блокируется до тоговремени, когда они будут. Ну и т. п. Вобщем есть ли в Java нечто подобное и почему ? -------------------- Имею Мнение Хрен Оспоришь |
|||
|
||||
Domestic Cat |
|
||||||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Ну я просто для примера приведу код асинхронного сервера (из J. Hart, Java 1.4 Core Platform Update):
Server2 может делать accept, чтение и запись в несколько сокетов в одном потоке.
Конкретная имплементация MessageSender и MessageReceiver не важна, но если нужно, могу и их запостить Добавлено @ 16:56
Это сообщение отредактировал(а) Domestic Cat - 20.8.2004, 16:52 -------------------- |
||||||||||||
|
|||||||||||||
redrick |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 547 Регистрация: 7.1.2004 Где: Москва Репутация: 3 Всего: 5 |
спасибо большое за примеры (по хорошему сам конешно лазить бы должен =) ) -
прояснилось -------------------- Имею Мнение Хрен Оспоришь |
|||
|
||||
Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
Нема за що, как говорят у нас в Канадi
![]() -------------------- |
|||
|
||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |