![]() |
|
Модераторы: LSD, AntonSaburov |
![]()
|
|
| Anton Vatchenko |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 21.5.2004 Репутация: нет Всего: -1 |
У меня такая проблема. Есть главный поток, который плодит потоки (Main), есть поток, который "наблюдает" за созданными потоками, то есть всем им шлет сообщения (Update). В классе Main есть Вектор, в котором хранятся указатели на потоки. Создается новый поток - добавляется элемент в Вектор. Вот другой вопрос: как при выходе из потока не сломать Update. Приведу куски:
Получается, что иногда в Update производится работа с уже удаленным из списка потоком, который уже не работает... Это сообщение отредактировал(а) Anton Vatchenko - 21.12.2006, 15:36 |
|||
|
||||
| powerOn |
|
|||
![]() software saboteur ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 4367 Регистрация: 7.10.2005 Репутация: 47 Всего: 159 |
попробуй прежде чем что-то с потоком делать, выполнить проверку: жив он или нет. У класса Thread есть подходящий метод: isAlive(). Если поток не живой, то путь его из коллекции удалит тот, кто и делал проверку. |
|||
|
||||
| Anton Vatchenko |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 21.5.2004 Репутация: нет Всего: -1 |
проверку то можно сделать, но работа с потоком может производиться около секунды. Не делать же перед каждой командой проверку, жив ли он еще...
|
|||
|
||||
| Shurr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 24.10.2006 Репутация: 5 Всего: 7 |
Не совсем понятен один момент: как работа самого потока MyThread совмещается с апдейтом этого потока, причем в течении секунды? Они работают с независимыми кусками данных, или что? Не совсем понятна суть такого взаимодействия, а следовательно не видно где синхронизировать...
|
|||
|
||||
| Anton Vatchenko |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 21.5.2004 Репутация: нет Всего: -1 |
1. Синхронизовать нужно только в закрытии потока.
2. Они работают с одними данными, которые синхронизированы. То есть есть один поток, который следит за остальными. Эти остальные потоки между собой не работают. Они могут послать команды главному потоку, и поток может послать каждому из них команды. Не иначе. Это сообщение отредактировал(а) Anton Vatchenko - 21.12.2006, 18:59 |
|||
|
||||
| Shurr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 24.10.2006 Репутация: 5 Всего: 7 |
Ок, тогда такой вопрос: по логике работы если поток завершил работу во время апдейта - он должен подождать пока его не закончат апдейтить, или должен прекратиться апдейт?
|
|||
|
||||
| s8e8r8g8e |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 41 Регистрация: 12.5.2006 Репутация: 1 Всего: 1 |
вроде бы если вначале апдейта не залочить какойнибудь объект до снятия лока на который все потоки не могут завершиться то проблема будет что апдейт может попробовать работать с уддалённым из вектора потоком(точнее обратится по несуществующему индексу наример, или по этому индексу будет уже другой поток), или что-то не так?
а вот почему может быть проблема при апдейте завершённого потока, ну завершён, ну пройдёт апдейт впустую (ну пусть данные в нём обновятся) ну ниначто это не повлияет ну и что с того Это сообщение отредактировал(а) s8e8r8g8e - 21.12.2006, 20:25 |
|||
|
||||
| Anton Vatchenko |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 21.5.2004 Репутация: нет Всего: -1 |
В том то и дело, что если поток умрет, то нужно работать не с ним, а с чем-то другим (например, записать неотправленные в базу данных).
|
|||
|
||||
| Shurr |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 112 Регистрация: 24.10.2006 Репутация: 5 Всего: 7 |
Честно говоря суть подобного взаимодействия настолько неясна, что посоветовать что-то конкретное очень сложно. Из того что я вижу можно предложить пару решений, но не знаю насколько они подойдут:
1. Организовать поддержку транзакций. Весь Update потока происходит в одной транзакции. Перед окончанием апдейта происходит проверка: если поток еще жив - коммит транзакции, если нет - откат. 2. Добавить проверку на "живость" потока в методы класса MyThread, при помощи которых наблюдающий поток взаимодействует с ним (я так понимаю, их должно быть немного). В случае если поток уже завершил свою работу - выбрасывать исключение. В наблюдающем потоке исключение отлавливать и соответствующим образом обрабатывать. Да, и еще одно: лучше не работать напрямую с вектором в таком виде, как это представлено в примере. Если есть коллекция, содержимое которой будет меняться из разных потоков - то для пробегания по ее элементам стоит написать специальный синхронизированный итератор. |
|||
|
||||
| Anton Vatchenko |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 460 Регистрация: 21.5.2004 Репутация: нет Всего: -1 |
Спасибо
|
|||
|
||||
![]()
|
| Правила форума "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. |