Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Thread.stop() - deprecated. а если НАДО??? 
:(
    Опции темы
BegemotX2
Дата 7.10.2007, 15:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 13.11.2005

Репутация: 1
Всего: 1



Приложение - программа тех анализа для биржевых торгов.

Приложение компилирует и запускает (в новом thread) некий .java файлик (стратегию торгов). Требовать от разработчиков стратегий, чтобы при длительных вычислениях проверялось какое-либо условие на остановку - неразумно, поскольку написанием стратегий будут заниматься "не очень" искушенные в java люди.

Стратегия может получать некие данные от ядра, при этом используется синхронизация на источниках данных. 

Запущенную стратегию необходимо уметь останавливать в любой момент.
Если использовать Thread.stop(), то как и гласит документация к java, все блокировки снимаются, и источники данных могут оказаться "damaged" (избежать этого не получается).

Может быть, кто-то встречался с подобной проблемой и знает, как ее решить?
На ум приходит только catch(ThreadDeathError) - и попытка "починить" источники данных.

Подскажите, кто что знает.
Заранее спасибо.
PM MAIL   Вверх
w1nd
Дата 7.10.2007, 16:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вертилятор
***


Профиль
Группа: Завсегдатай
Сообщений: 1077
Регистрация: 22.3.2006
Где: Москва

Репутация: 20
Всего: 54



По-моему, проверка вида
Код
if (Thread.isInterrupted()) {
    throw new InterruptedException();
}

не настолько сложна для понимания.

Это сообщение отредактировал(а) w1nd - 7.10.2007, 16:04


--------------------
user posted imageuser posted image
PM MAIL ICQ   Вверх
kkorsakoff
Дата 7.10.2007, 16:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 378
Регистрация: 18.10.2005
Где: Санкт-Петербург

Репутация: 3
Всего: 14



Была подобная задача, расскажу свое решение, хотя может оно и далеко не лучшее.

Так же есть пользовательский код, который что-то делает и использует какие-то (условно) "ресурсы".

Со stop лучше не эксперементировать, все-таки даже сановцы пишут о нежелательности твоего метода (обработка ThreadDeathError)

Цитата

Why is Thread.stop deprecated?
Because it is inherently unsafe. Stopping a thread causes it to unlock all the monitors that it has locked. (The monitors are unlocked as the ThreadDeath exception propagates up the stack.) If any of the objects previously protected by these monitors were in an inconsistent state, other threads may now view these objects in an inconsistent state. Such objects are said to be damaged. When threads operate on damaged objects, arbitrary behavior can result. This behavior may be subtle and difficult to detect, or it may be pronounced. Unlike other unchecked exceptions, ThreadDeath kills threads silently; thus, the user has no warning that his program may be corrupted. The corruption can manifest itself at any time after the actual damage occurs, even hours or days in the future. 



--------------------------------------------------------------------------------

Couldn't I just catch the ThreadDeath exception and fix the damaged object?
In theory, perhaps, but it would vastly complicate the task of writing correct multithreaded code. The task would be nearly insurmountable for two reasons:

A thread can throw a ThreadDeath exception almost anywhere. All synchronized methods and blocks would have to be studied in great detail, with this in mind. 
A thread can throw a second ThreadDeath exception while cleaning up from the first (in the catch or finally clause). Cleanup would have to repeated till it succeeded. The code to ensure this would be quite complex. 
In sum, it just isn't practical. 


Завершать поток лучше с Thread.interrupt() и все-таки!!! просить юзеров после длительных операций проверять .interrupted().

Всю работу со скриптом (аналог твоего пользовательского .java) у меня выполняет класс ApplicationContext, который предоставляет все необходимое скриптам: доступ к ресурсам, среде и вообще...
Все методы ApplicationContext проверяют, не должен ли данный скрипт быть убит (т.е. поток остановлен).

Так что если скрипт и не захочет себя проверять на предмет его остановленности - он не сможет ничего сделать вне себя. Никаких новых ресурсов он не получит и при первой же попытке получит Exception и отвалится.

Все(!)  внешние ресурсы скрипт получает через методы типа ApplicationContext.getResource(...), где в параметрах он описывает что за тип ресурса он хочет (в моем примере - это телефонные ресурсы типа ISDN-каналов, голосовые и факс-каналы).

Соответственно наш ApplicationContext знает, какие ресурсы какой скрипт взял себе.

При необходимости застопить поток выполняем:

1. выставлем флаг, что поток должен убит - следовательно новых ресурсов он уже не получит
2. делаем Thread.interrupt()
3. ждем Nнное количество времени на корректное завершение (можно исключить этот этап)
4. принудительно освобождаем и подчищаем ресурсы, занятые скриптом, если они еще не были освобождены и подчищены.
Закрываем все коннекшены к базе, http и прочее.

В данном случае возможен вариант, что скрипт не захочет останавливаться сам и будет дальше использовать уже взятые ресурсы.
Мне это было не критично.
Но если задача требует большего контроля за этим, то можно над всеми ресурсы, выдаваемыми скрипту сделать обертки.

Но это сложнее и обычно не требуетсяsmile

Может перемудрил, но по крайней мере такой вариант позволяет аккуратно вырубать пользовательские "шедевры":)

P.S. А кстати не удобнее ли тебе будет вместо компилирования java работать со скриптами. Вроде бы для неискушенных людей проще скриптовать.
Или там 6 jre нельзя поставить?
PM MAIL WWW ICQ   Вверх
BegemotX2
Дата 8.10.2007, 10:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 21
Регистрация: 13.11.2005

Репутация: 1
Всего: 1



С одной стороны, проверка на interrupted - на самом деле не очень уж сложна.
И всякие ресурсы у меня тоже через через подобие ApplicationContext.
НО.. Если в конце концов пользовательский "шедевр" может и просто в бесконечный цикл войти..  
А в другом Thread'е другой шедевр (получше) в этот момент может торговать реальными (причем не моими, и не маленькими) деньгами. И хотелось бы, чтобы шедевр №1 можно было гарантировано убить. 

В принципе, во всей программе только 2 класса могут быть серьезно damaged в случае остановки стратегии.. остальные - максимум в кэш поместить не успеют что-то.. и если сановцы рекомендуют не использовать ThreadDeathError только из-за сложности, то в моем случае это кажется реализуемым.

kkorsakoff, а по поводу компилирования vs скриптинг - производительность критична.

PM MAIL   Вверх
AlexeyVorotnikov
Дата 8.10.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 658
Регистрация: 18.6.2007
Где: Москва

Репутация: 10
Всего: 18



Если нельзя, но очень хочется, то можно smile


--------------------
RTFM!
Три источника и три составные части Java: The Java Language Specification, Java Platform API Specification, The Java Virtual Machine Specification
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0476 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.