![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| sol78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: нет Всего: 0 |
Значит дело обстоит так.. есть куча threadов нужно в определенный момент собщить нужному threadу что нужно закончить, например, начатое и остановиться...
Ищу эллегантный способ это сделать!? Зарание благодарна! |
|||
|
||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
вот немного поизвращался
здесь по нажатию кнопки запускается новый поток. по клику мыши можно приостановить и продолжить.
Это сообщение отредактировал(а) dorogoyIV - 2.9.2007, 01:33 |
|||
|
||||
| COVD |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
"Эллегантного" способа нет и быть не может. Поток просто выполняет последовательность команд на своем пути. Если он, например, вошел в блок синхронизации, т.е. закрыл обьект для других потоков, и вдруг ему пришла команда остановиться, то обьект останется навечно запертым для других потоков, т.е. недоступным. Чтобы корректно остановиться, потоку нужно снять все замки (lock) с обьектов, которые он понавешал (т.е. исполнять код пока не выйдет из блоков синхронизации). Это уже компетенция программиста, как это сделать лучше. Как в примере выше, эта задача решается путем выставления флагов на пути потока. Если флаг имеет определенное значение, то метод run() должен завершиться (через break() или return()) . И программист должен предусмотреть код, который надо выполнить при выходе: снять все ненужные замки, закрыть открытые соединения и прочие действия для корректного останова потока.
|
|||
|
||||
| niasilil |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
dorogoyIV, это ты зря функцию Suspend() обозвал, чего то я даже напрягся поначалу.
Проблема с wait notify в твоем коде в том что ты заранее не знаешь какой thread запустится Object
-------------------- SCJP 5.0, SCJD |
|||
|
||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
||||
|
||||
| niasilil |
|
||||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
Как же не нужно, если я кликаю на такой то thread и он бац, не запустился, а запустился соседний. Ты не пойми чего, я не критикую, просто напомнил. -------------------- SCJP 5.0, SCJD |
||||
|
|||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
niasilil, а у меня такого нету - все нормально работает
|
|||
|
||||
| niasilil |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 325 Регистрация: 4.6.2007 Где: USA Репутация: 8 Всего: 9 |
> ...The choice is arbitrary and occurs at the discretion of the implementation. ... Я только хотел отметить, что это не значит что на каком нибудь линуксе это так же будет работать. Не гарантируется. -------------------- SCJP 5.0, SCJD |
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
dorogoyIV, niasilil прав - лучше использовать notifyAll(). А я бы сделал примерно так:
Это сообщение отредактировал(а) w1nd - 2.9.2007, 18:56 -------------------- ![]() ![]() |
|||
|
||||
| sol78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: нет Всего: 0 |
Я запуталась, мне не нужно синхронизировать потоки, мне только нужно принимать от них сообщения и и отправлять данному потоку сообщения.Проблема только в том что я не знаю как эллегантно идентифицировать поток?
Можно какойто простой пример с объяснением, плиз!? Добавлено через 9 минут и 3 секунды Да и мне нужно именно знать откуда пришел мессадже |
|||
|
||||
| sol78 |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 366 Регистрация: 7.7.2007 Репутация: нет Всего: 0 |
dorogoyIV,
а как передать из потока мессадже, и как определить от какого среда мессадж??? |
|||
|
||||
| w1nd |
|
|||
![]() Вертилятор ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1077 Регистрация: 22.3.2006 Где: Москва Репутация: 20 Всего: 54 |
У потоков есть name. Получить текущий поток можно с помощью Thread.currentThread(). Если вам нужно остановить поток, то для этого нужно использовать блокировку с помошью wait()/notify() или с помощью защёлок, как показал я (потоки нельзя запускать повторно).
-------------------- ![]() ![]() |
|||
|
||||
| dorogoyIV |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1503 Регистрация: 26.3.2007 Репутация: 3 Всего: 46 |
w1nd уже ответил. ну так для полной ясности - в тот код, что я дал, в любой метод mouseXXX(MouseEvent e) добавь строку System.out.println(getName()); . будет наглядно
|
|||
|
||||
![]()
|
| Правила форума "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. |