![]() |
Модераторы: LSD, AntonSaburov |
![]() ![]() ![]() |
|
dzheika |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 26.3.2008 Репутация: нет Всего: 1 |
несмотря на то, что методы stop() & destroy() устарели и небезопасны, даже они не помогают, есть ли какая-нибудь возможность разблокировать монитор, который захватил "поток-вредитель"?
|
|||
|
||||
polosatij |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1143 Регистрация: 22.2.2004 Где: Stuttgart<-> ;Karlsruhe, Germany Репутация: 1 Всего: 8 |
The interrupt() was created by sun as a solution sun came up for the problems of thread stop(), it should be the cannonical way to stop a thread. так пробовал? http://java.sun.com/j2se/1.5.0/docs/api/ja...tml#interrupt() |
|||
|
||||
Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
||||
|
||||
dzheika |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 26.3.2008 Репутация: нет Всего: 1 |
мдя... я про stop "даже они не помогают", а interrupt так вообще только выставляет флаг и выкидывает эксепшион, если поток в режиме ожидания, так что interrupt не поможет даже в случае while(true); (без блокировки монитора с мьютексом текущего потока) ---- нет, System.exit(0); не катит, надо только поток грохнуть, дело в том, что приложение запускает некоторые задачи из "чужих" либ отдельным потоком, есть таймаут на выполнение =), а если допустить, что "чужая" либа содержит такой код, то ... то вот пока еще не знаю, что делать =) но имхо jvm может его прикончить, кстати, так же поток может отловить и ThreadDeath, да и вообще любой Throwable, проигнорировав его и продолжив какой-то цикл, который оказался с тупиковым условием выхода. Это сообщение отредактировал(а) dzheika - 9.10.2008, 10:45 |
|||
|
||||
Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
dzheika, не надо использовать тупые библиотеки, которые не могут работать нормально, или если это ваш код, просто приведите его в порядок.
|
|||
|
||||
dzheika |
|
|||
Новичок Профиль Группа: Участник Сообщений: 12 Регистрация: 26.3.2008 Репутация: нет Всего: 1 |
в реальном случае код мой
![]() Это сообщение отредактировал(а) dzheika - 9.10.2008, 10:50 |
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: нет Всего: 134 |
а если топик стартер пишет что-нибудь наподобие robocode, где запускаемый код по определению чужой? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
Platon |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1801 Регистрация: 25.4.2006 Репутация: 16 Всего: 40 |
Mayk, значит надо долбить саппорт, и говорить, что у них код гнилой.
|
|||
|
||||
SoulKeeper |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 375 Регистрация: 14.1.2007 Где: Ukraine, Lviv. Репутация: 11 Всего: 15 |
Нуууу можно попробувать запускать задачи в форковой JVM, на подобии анта при fork=true, ну и грохать другой процесс при таймауте... Только вот это уже зависит от того что задачи должны делать.
|
|||
|
||||
COVD |
|
|||
Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1655 Регистрация: 26.7.2005 Репутация: 17 Всего: 43 |
Когда вы делаете запрос из браузера серверу и нет ответа в течении некоторого времени, браузер закрывает соединение и показывает соответствующую страницу об ошибке. А сервер, возможно, в это время продолжает работать над ответом. Аналогично и с задачей в отдельном потоке. Приложение не дождавшись ответа от потока должно продолжать свою работу, а поток может продолжать крутиться (только его результата уже никто не ждет) пока не помрет естественной смертью. Это обычная практика.
Если же проблема в том, что такой поток сильно нагружает систему и желание его остановить вызвано необходимостью освободить ресурсы компьютера, то разумно изолировать эти потоки ( решающие изолированные задачи да еще с помощью сторонних библиотек ! ) от приложения, а именно перенести в другое приложение или вообще на другую машину, т.е. выделить в отдельный сервис. Это сообщение отредактировал(а) COVD - 9.10.2008, 15:00 |
|||
|
||||
Dims |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 4 Всего: 11 |
Что-то возникают сомнения, что stop() не останавливает поток. В документации ясно написано, что поток останавливается и все мониторы освобождаются.
Вероятно, проблема в чём-то другом, например, в правильном возобновлении работы других потоков после остановки вредителя или в нарушении целостности тех данных, с которыми работал поток-вредитель. Добавлено через 6 минут и 4 секунды Из текста программы я вижу, что поток захватывает монитор на объект thread, что и является причиной зависания. Метод stop работаем внутри synchronized(this), то есть, он не может даже начать работу. Вообще, захватывать монитор на объект потока это нехарактерно. Вот такой код работает:
Добавлено через 7 минут и 49 секунд Можно ещё вот так переписать:
|
||||
|
|||||
![]() ![]() ![]() |
Правила форума "Java" | |
|
Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | Java: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |