| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Java: Общие вопросы > Возврат по условию-2 |
| Автор: Alone 19.8.2004, 16:34 |
| По ходу дела возник еще вопрос: а как отловить таймаут в ожидании??? wait(timeout) генерит ексепшны # IllegalArgumentException # IllegalMonitorStateException # InterruptedException но это не туда... как быть? Чего я не учел? как мне определить, что было прерывание по таймауту??? |
| Автор: AntonSaburov 19.8.2004, 17:15 |
| А почему должно быть прерывание по таймауту. Если просто истекло время - программа продолжит свое исполнение. И все. Т.е. отсутствие эксепшенов и есть признак, что таймаут кончился. Если ошибаюсь - поправьте. |
| Автор: Alone 19.8.2004, 17:45 |
| Скажем так: из объекта А я отправил запрос объекту Б, который работает с сокетом. Он в свою очередь удачно отправил запрос на сервер. Но я со стороны А ставлю условие, что ответ должен прийти не позднее чем через 3 сек. и ставлю таймаут. Если нужный мне тип ответа придет - объект Б нотифицирует моего ожидающего А и он продолжит работу. Но если вылет по таймауту - я должен сигнализировать об ошибке. Вот такая ситуация... Я кстати уже нашел решение. Объект А: boolean a=false; lock.wait(timeOut) if(!a) { timeout error } Объект Б: if(received){ A.a=true; lock.notify() } что то типа такого... |
| Автор: Domestic Cat 19.8.2004, 21:34 |
| А лучсе всего использовать java.nio.* - он позволяет асинхронную работу с сокетами, что гораздо эффективнее. |
| Автор: LSD 19.8.2004, 23:04 |
| Alone решение правильное (я бы тоже так делал), только добавить синхронизацию и все. |
| Автор: redrick 20.8.2004, 03:58 |
| я вот подобную вещь видел сделанной немного по-другому... завтра попробую раскопать сорс и сказать как именно, но идея в том, что вокруг объекта Б делается класс типа TimeoutSocket, а он в случае таймаута кидает ексепшн, который и ловится... |
| Автор: Alone 20.8.2004, 09:51 | ||||
Естественно с синхронизацией, я просто в примере не писал. Добавлено @ 09:57
Эффективнее по сравнению с чем? |
| Автор: Alone 20.8.2004, 10:44 | ||
Тут хитрость - в работе с сокетами... в данном случае с сокетом одновременно работают несколько объектов. каждый из них отправляет через сокет запросы. Когда что-то приходит на сокет - оно парсится и выполняется соответствующие вызова каких либо методов. вот тут никто никакой гарантии на временные интервалы дать не сможет. Пример 1. Объект "А" послал запрос сокету (Объект "Б") 2. Объект "С" тоже послал свой запрос "Б" "Б" взаимодействует с сервером 3. в "Б" возвращается ответ для "А" , который передается по сети 20сек 4. И о каком таймауте для сокета может идти речь Сокет "работает" честно... а вот данные пришли позднее чем были нужны Если сокет по какой либо "технической" причине не сможет принять / отправить данные , он сообщит через своего обработчика ошибок, и это будет ошибка сети Хух... заговорился... |
| Автор: Domestic Cat 20.8.2004, 15:14 | ||
По сравнению с синхронным IO, то есть java.net.*, java.io.*. |
| Автор: Alone 20.8.2004, 16:09 |
| Гм... я почему то думал, что как раз наоборот, синхронные лучше/эффективнее асинхронных... Где я неправ? |
| Автор: Domestic Cat 20.8.2004, 16:28 |
| Синхронный IO означает, что поток должен ждать завершения действия (например, подключения клиента). В это время ничего другого поток делать не может. Значит, нужно несколько потоков. В асинхронном такие операции не являются блокирующими, и поток может одновременно (почти Если нужен всего один поток, то это естественно, эффективнее, чем несколько потоков. |
| Автор: redrick 20.8.2004, 16:41 | ||
вот по этому поводу
интересна такая вещь : это реализуется внутри самого потока ? т. е. это ведь возможно только если один объект знает о нескольких потоках, которые он обслуживает (скажем сокет соединяется с несколькими серверами). Я по роду деятельности сталкивался с асинхронным API в .NET - там есть beginInvoke(), который отправляет запрос на сервер и выдает вам хендел hr, вы делаете что хотите и когда закончили и вам понадобились данные вызываете endInvoke(hr), который либо выдает данные, либо блокируется до тоговремени, когда они будут. Ну и т. п. Вобщем есть ли в Java нечто подобное и почему ? |
| Автор: Domestic Cat 20.8.2004, 16:50 | ||||||||||||
| Ну я просто для примера приведу код асинхронного сервера (из J. Hart, Java 1.4 Core Platform Update): Server2 может делать accept, чтение и запись в несколько сокетов в одном потоке.
Конкретная имплементация MessageSender и MessageReceiver не важна, но если нужно, могу и их запостить Добавлено @ 16:56
|
| Автор: redrick 20.8.2004, 18:49 |
| спасибо большое за примеры (по хорошему сам конешно лазить бы должен =) ) - прояснилось |
| Автор: Domestic Cat 20.8.2004, 19:33 |
| Нема за що, как говорят у нас в Канадi |
| Автор: Alone 21.8.2004, 11:39 |
| Domestic Cat Дякуэмо за код |