![]() |
|
Модераторы: 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 |
||||||
|
|||||||
| Sardar |
|
|||
![]() Бегун ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 6986 Регистрация: 19.4.2002 Где: Нидерланды, Groni ngen Репутация: 4 Всего: 317 |
Да. Определись с задачей, нужны ли тебе два потока, первый ведь остановиться и будет ждать. Задача где реально нужно несколько потоков, это например загрузка файла под FTP с нескольких коннектов. Но и тогда можно передать ссылку загрузчикам на главное приложение, через которую они отдают инфу. При этом АПИ синхронизированно (synchronized методы), когда приходит последний кусок инфы, выполняем требуемое действие. Другими словами не нужен C подход, где ты вызываешь метод обьекта и сам блокируешся, а после когда работа окончена, разблокируешся и пролжишь работу. Вместо этого раздели код на две части, первый метод поднимет MyNetworkSession, второй будет вызван самим MyNetworkSession когда работа будет выполненна. -------------------- Опыт - сын ошибок трудных © А. С. Пушкин Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik Оценить мои качества можно тут. |
|||
|
||||
| OlegRu |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 16 Регистрация: 2.12.2005 Репутация: нет Всего: нет |
Спасибо всем за участие!
|
|||
|
||||
![]()
|
| Правила форума "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. |