![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| OlegRu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2005 Репутация: нет Всего: нет |
1. Из второго потока идет коннект к серверу, в итоге возвращается некая строка.
2. Эта строка должна отобразиться в первом потоке путем disp.setCurrent(tb); 3. Кажись, надо расставить здесь synchronized, wait() и notify(), но не знаю как?! Подскажите, пожалуйста.
Это сообщение отредактировал(а) OlegRu - 13.12.2005, 18:41 |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
s = new MyNetworkSession(this);
s.start(); synchronized(this){ wait();//ставим текущий поток в ожидание } ... private Main obj; public MyNetworkSession(Main obj){ this.obj = obj; ... } public void run() { try{ Request(URL); synchronized(obj){ obj.notify(); //будим ждущий поток по завершении реквеста } } catch (Exception e){ } } Это сообщение отредактировал(а) COVD - 13.12.2005, 19:57 |
|||
|
||||
| Sardar |
|
||||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
COVD по моему ошибка с синхорнизацией,
Лочим на свой instance, внутри synchronized первый получивший тред уверен, что все остальные потоки будут блокироваться на этом обьекте, НО:
получаеться второй тред залочиться на synchronized(obj) и будет ждать пока первый поток отпусит обьект (выйдет из synchronized). Так как первый поток ждёт события, от заблокированного второго получаем deadlock... хотя до концане уверен Добавлено @ 01:33 Также задачу можно порешать вложенным классом, обьекто которог передадим MyNetworkSession. Вложенный класс будет играть роль listener'а события "готово" и возобновит работу. Всё может уложиться в одном потоке. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
||||
|
|||||
| OlegRu |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2005 Репутация: нет Всего: нет |
To COVD
Спасибо, я вроде понял суть в принципе. Сделал точно как вы написали. To Sardar А вы действительно правы, второй поток MyNetworkSession попадает в дедлок. Появляется сообщение о разрешении подключиться к инету и приложение замирает в молчании Что мне делать, как мне быть? А можно поподробнее о том, как сделать все в одном потоке (если нельзя в разных). Благодарю за ваше участие!
|
||||
|
|||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Нет, для wait и notify как раз так и надо делать, синхронизировать один и тот же обьект. В других случаях будет lock. |
|||
|
||||
| OlegRu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2005 Репутация: нет Всего: нет |
To COVD
А мне что с потоками делать? Сейчас в таком виде (выше) не работает. |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
определите , в каком месте проблема возникает. Расставьте System.out.println("..."), чтобы определить последовательность выполняемых операций.
|
|||
|
||||
| OlegRu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2005 Репутация: нет Всего: нет |
To COVD
Да, я расставил, где надо, println, и оказалось, что вся работа виснет при входе в метод Request(String url), а именно после вызова Connector.open(url); Но раньше (без этой синхронизации) коннект шел без проблем.
|
|||
|
||||
| Domestic Cat |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5452 Регистрация: 3.5.2004 Где: Dallas, US Репутация: 50 Всего: 172 |
-------------------- |
|||
|
||||
| Dancer |
|
||||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: нет Всего: 37 |
Во-первых: не уловил что это за метод такой в MyNetworkSession
а кто тогда вызывается (public void run() или этот start()), когда делаем s.start(); из public void commandAction(Command c, Displayable d) Во-вторых: добавь просмотр отлавливаемых Exception как в этом коде, я так думаю, туда попасть должен твой IOException из Request(String url) который у тебя стоит как throws, и поэтому он у тебя не попадёт в твой catch из Request метода
-------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! |
||||
|
|||||
| OlegRu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2005 Репутация: нет Всего: нет |
Ребята, спасибо за ваше внимание.
Значит-ца так. Я уже брожу два дня по инету в поисках решения проблемы и только-что наткнулся на это: Topic: thread + connector.open Оказывается, там тоже была некоторая проблема с одинаковым "корнем". Там человек жаловался на Connector.open(defaultURL), после которого у меня застывала программа. Тогда пришла мысль полностью закомментировать код в методе Request(String url) и написать так:
Теперь потоки ЗАМЕЧАТЕЛЬНО синхронизируются!! Первый поток ждет, пока пройдут 10 секунд во втором потоке, последний возвращает строку "File Contents: " первому потоку. И первый поток отображает ее в своем Алерте. Так что само устройство синхронизации потоков для этого случая, подсказанное COVD'ом, правильно на самом деле! Единственная беда, я не знаю как же быть с самим Connector.open !! Почему так происходит?? Или я еще не понимаю всей глубины происходящего! Если кто хочет разобраться,- то давайте вместе. Мне это очень надо |
|||
|
||||
| Dancer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: нет Всего: 37 |
а это не поможет?
Connector.open("http://ya.ru",Connector.READ, true); -------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! |
|||
|
||||
| OlegRu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2005 Репутация: нет Всего: нет |
To Dancer
Не, не помогает это. |
|||
|
||||
| Dancer |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 537 Регистрация: 29.4.2005 Где: Nizhniy Novgorod Репутация: нет Всего: 37 |
я уже понял что не помогате, сейчас подекомпилил классы, так вот что обнаружил, этот параметр в конечном счёте игнорируется в методе, где происходит непосредственный коннект.
-------------------- У программистов есть великая тайна: всё, что только можно, было давно кем-то когда-то написано. Разработчику только нужно знать в какое место кода какие строчки вставить! |
|||
|
||||
| OlegRu |
|
||||||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2005 Репутация: нет Всего: нет |
To Sardar
Получается, что вообще можно обойтись без синхронизации, например, так: В классе Main:
В классе MyNetworkSession сразу после метода Request(String url):
Я пробовал, так работает хорошо. To Dancer Я поставил Exception так:
но все равно не выдается мне почему-то текст ошибки. Это сообщение отредактировал(а) OlegRu - 15.12.2005, 17:56 |
||||||
|
|||||||
![]()
|
| Правила форума "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. |