![]() |
|
Модераторы: javastic, AntonSaburov |
![]()
|
|
| Max_1_ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 23.3.2007 Репутация: нет Всего: нет |
Здравствуйте!
Появилась проблема с работой критичного по времени кода. В программе работает несколько постоянных потоков и периодически запускаются временные. Программа считывает команды из последовательного порта и мне необходимо ускорить этот процесс. Иногда он выполняется быстро, когда не работает большинство потоков, но это редко. Хотелось бы както заблокировать потоки, которые мне надо, на время пока работает обмен командами. Не могу придумать как это сделать. Приходит в голову только такой метод: проверять наличие потока обмена командами в потоках которые хочу блокировать и при его наличие вызывать join(). Но он слишком загромоздит код, ведь это надо будет по всему коду такие проверки повставлять. Вообще насколько понял я могу заблокировать чужой поток, только в самом чужом потоке, а не из вне. :( Прошу помощи. Кто что может подсказать. |
|||
|
||||
| W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
А можно какой-нидь пример кода или схему? ато на словах не особо воспринимается
-------------------- iOS developer |
|||
|
||||
| eugine_s |
|
|||
|
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 581 Регистрация: 14.11.2007 Где: Киев Репутация: 17 Всего: 17 |
Попробуй выставлять приоритеты потокам.
Тот, который критичный, ставь MAX_PRIORITY, а остальным меньшие приоритеты. У меня как-то была чем-то похожая проблема, решилось установлением приоритетов потоков. |
|||
|
||||
| Max_1_ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 23.3.2007 Репутация: нет Всего: нет |
Да, пока так и работает. Но плохо помогает. to WOLF: Код если выкладывать, то много придется. Попробую получше обьяснить. Есть несколько постоянных потоков А, В и С. Есть временные потоки D, E, F. И есть поток который запускается из системы G. G должен быстро выполняться. Поэтому охото заблокировать A,B,C и если есть D,E,F пока выполняется G. Как это можно реализовать или посоветуйте куда копать. |
|||
|
||||
| W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
Тут по ходу просто приоритетами не обойтись. надо именно делать приостановку потоков.
Я бы сделал примерно так:
-------------------- iOS developer |
|||
|
||||
| zzzvyk |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 21.4.2007 Где: Киев Репутация: нет Всего: нет |
А это ничего, что isFinished не синхронизирован?
я бы сделал finished volatile. Но это ИМХО... Добавлено через 12 минут и 24 секунды Немного подумав я пришел к заключению, что private boolean finished = false; private boolean stop = false; private boolean pause = false; должны бы быть volatile; потому что, например один поток может запросить tPause(), tConitnue(), tStop(), а другой в это время проверить статус - получается что данные он получит устаревшие? Или как? Это сообщение отредактировал(а) zzzvyk - 30.4.2009, 11:23 |
|||
|
||||
| W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
Да, пропустил, но в данном случае - не критично(там для этого есть цикл, который каждый раз идет по всем потокам и проверяет финишд они или нет).
тогда лучше так
-------------------- iOS developer |
|||
|
||||
| zzzvyk |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 64 Регистрация: 21.4.2007 Где: Киев Репутация: нет Всего: нет |
тада у тебя получается 2 монитора
this objectMonitor как результат - IllegalMonitorStateException, ИМХО. вообще я бы посоветовал сходить на сайт Doug Lea и проанализировать готовые решения. Для Java1.5 они уже устарели, для телефонов - самое оно (ну, возможно немного тяжеловатые, но это лучше чем криво) |
|||
|
||||
| Max_1_ |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 8 Регистрация: 23.3.2007 Репутация: нет Всего: нет |
Большое спс Wolf за код, буду пробовать у себя.
А что вы посоветуете если у меня DoingSomething в потоке, продолжительный. Где-то минуту. Просто код выполняется на контроллере, и он довольно медленный. |
|||
|
||||
| W0LF |
|
||||||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
zzzvyk, как Вы выразились - по Вашему скромному мнению Вы считаете что будет IllegalMonitorStateException, я думаю что Вам так и следует оставаться при своем скромном мнении, столько критики и ни одного дельного совета. Такое чувство что Вы недавно начитались книжек умных, но на практике еще не успели применить. Объясните как можно получить IllegalMonitorStateException, если он бросается только методами wait и notify?
спасибо за лаконичный комментарий к моему коду, надеюсь, Вы пишите намного лучше. Добавлено через 1 минуту и 59 секунд
я думаю что кусок кода
вставить просто где-нидь еще, то есть чтоб было пару мест, где можно приостановить выполнение потока -------------------- iOS developer |
||||||
|
|||||||
| W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
этого все-таки делать нельзя - будет дедлок. например один поток зайдет в run, у него будет две критический секции на this и на оbjectMonitor, вторую он освобождает, а первую - нет, и когда кто-то попросит isFinished то он будет долго и нудно ждать. тут лучше синхронизировать по отдельности или же volatile -------------------- iOS developer |
|||
|
||||
| math64 |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2505 Регистрация: 12.4.2007 Репутация: 8 Всего: 72 |
а разве в j2me можно использовать volatile?
|
|||
|
||||
| W0LF |
|
|||
![]() alexander lonsky ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1164 Регистрация: 9.2.2006 Где: Ukraine.Dnepropet rovsk Репутация: 19 Всего: 20 |
по крайней мере не ругается, а проверить правильность выполнения - сейчас пока нет времени, если честно - я и в большой джаве никогда его не использовал, пользовался синхронизацией
-------------------- iOS developer |
|||
|
||||
![]()
|
FAQ раздела лежит здесь! |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Java ME (J2ME) | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |