![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
Fieral |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 250 Регистрация: 10.12.2007 Репутация: нет Всего: 1 |
собсно вопрос:
есть входящий поток данных и исходящий. как зарулить входящие данные в исходящие? --------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор. |
|||
|
||||
Kircul |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 166 Регистрация: 20.2.2007 Репутация: 6 Всего: 7 |
Вот так. |
|||
|
||||
Fieral |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 250 Регистрация: 10.12.2007 Репутация: нет Всего: 1 |
Получается что выполняющий этот код процесс, пока данные не поступают, будет спать внутри метода read ?
--------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор. |
|||
|
||||
ivanovpv |
|
||||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 4 Всего: 28 |
Да если не засунуть все это хозяйство внутри отдельного потока. Тогда основной поток будет спокойно жить своей жизнью... Можно использовать available(), чтобы не блокировать read'ом
-------------------- Aut viam inveniam aut faciam |
||||
|
|||||
Fieral |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 250 Регистрация: 10.12.2007 Репутация: нет Всего: 1 |
Хотелось бы услышать критику. --------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор. |
|||
|
||||
ivanovpv |
|
|||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 4 Всего: 28 |
1) У вас read() блокирует ваш поток, нужно использовать available() для проверки наличия ввода во входящем потоке 2) Чтобы основной поток дышал нужны вызывать sleep() 3) Метод остановки потока должен быть synchronized, иначе можно нарваться на грубость при работе с потоками Набросал примерно так:
Только не забудьте места падения в run() охватить блоками try-catch (сразу весь while) -------------------- Aut viam inveniam aut faciam |
|||
|
||||
Fieral |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 250 Регистрация: 10.12.2007 Репутация: нет Всего: 1 |
Давайте по порядку:
1) read() блокирует Thread t, который я специально для этого и создал (чтоб он там мучился отдельно от основного потока программы). 1.1) Если я буду использовать available(), то когда входящий поток достигнет своего конца, он станет постоянно возвращать (метод available()) ответ 0. И мой поток так и не узнает что там уже "конец". (по этой же причине я и выношу код перенаправления данных в отдельную нить t и юзаю там read(), который при достижении конца выдаст -1) 2) Так как мне может понадобиться отключить "насос" до окончания потока входных данных, то для выполнения отключения я прибиваю t методом t.interrupt();. Таком образом мне удастся "выколупать" спящий t из метода read() (если вдруг окажется что он там уснул в ожидании входных данных). --------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор. |
|||
|
||||
ivanovpv |
|
|||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 4 Всего: 28 |
Да он там и будет мучиться и одновременно не даст дышать основному потоку, поскольку у него нет sleep'а, чтобы дать дышать основному потоку read() если нет данных блокирует свой поток, раз его блокирует то заблокирует и основной поток (см. выше) Почти правильно. Но лучше все же останавливать поток штатным средством, а именно устанавливая nullWriteMode в false, в конце концов его проверку можно засунуть в цикл чтения/записи, так что можно будет остановить поток во время чтения/записи, а не после. -------------------- Aut viam inveniam aut faciam |
|||
|
||||
Fieral |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 250 Регистрация: 10.12.2007 Репутация: нет Всего: 1 |
Если поток сидит внутри read() и там ничего не поступает, то он никогда не выйдет наружу что-бы проверить флаг остановки.
Во время ожидания приостановленный поток не отнимает ресурсы процессора - его усыпляет JVM. --------------------
Если собака свернулась калачиком, значит будет дождь, а если сидит выпучив глаза, значит у неё запор. |
|||
|
||||
ivanovpv |
|
|||
![]() Варвар ![]() ![]() Профиль Группа: Участник Сообщений: 639 Регистрация: 26.1.2005 Где: Москва Репутация: 4 Всего: 28 |
Именно поэтому и нужен available() ![]() Это сообщение отредактировал(а) ivanovpv - 29.10.2009, 21:34 -------------------- Aut viam inveniam aut faciam |
|||
|
||||
![]() ![]() ![]() |
Правила форума "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. |