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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как убить "хитрый" Thread? Тред захватывает крит.секцию "себя" 
:(
    Опции темы
dzheika
Дата 8.10.2008, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



несмотря на то, что методы stop() & destroy() устарели и небезопасны, даже они не помогают, есть ли какая-нибудь возможность разблокировать монитор, который захватил "поток-вредитель"?

Код

    public static void main(String[] args) throws Exception {
        
        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println("started");
                synchronized (this) {
                    while (true)
                        ;
                }
            }
        };
        thread.start();
        Thread.yield();
        thread.stop(); //deprecated, unsafe
        System.out.println("stoped");
    }

PM MAIL   Вверх
polosatij
Дата 8.10.2008, 20:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 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()


--------------------
PM   Вверх
Platon
Дата 9.10.2008, 08:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Цитата(dzheika @  8.10.2008,  17:29 Найти цитируемый пост)
есть ли какая-нибудь возможность

Код

System.exit(0);

PM MAIL ICQ   Вверх
dzheika
Дата 9.10.2008, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Цитата(polosatij @ 8.10.2008,  20:55)
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()

мдя... я про stop "даже они не помогают", а interrupt так вообще только выставляет флаг и выкидывает эксепшион, если поток в режиме ожидания, так что interrupt не поможет даже в случае while(true); (без блокировки монитора с мьютексом текущего потока)

----
нет, System.exit(0); не катит, надо только поток грохнуть, дело в том, что приложение запускает некоторые задачи из "чужих" либ отдельным потоком, есть таймаут на выполнение =), а если допустить, что "чужая" либа содержит такой код, то ... то вот пока еще не знаю, что делать =) но имхо jvm может его прикончить, кстати, так же поток может отловить и ThreadDeath, да и вообще любой Throwable, проигнорировав его и продолжив какой-то цикл, который оказался с тупиковым условием выхода.

Это сообщение отредактировал(а) dzheika - 9.10.2008, 10:45
PM MAIL   Вверх
Platon
Дата 9.10.2008, 10:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



dzheika, не надо использовать тупые библиотеки, которые не могут работать нормально, или если это ваш код, просто приведите его в порядок.
PM MAIL ICQ   Вверх
dzheika
Дата 9.10.2008, 10:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



в реальном случае код мой smile и я такого точно не буду делать, а вообще сначала по хорошему посылается interrupt, потом join с некоторым временем на завершение, и если поток еще жив, тогда уже stop (вернее уже отказался от stop), просто обобщив задачу и рассмотрев такой случай, понял, что не могу на 100% убить поток.

Это сообщение отредактировал(а) dzheika - 9.10.2008, 10:50
PM MAIL   Вверх
Mayk
Дата 9.10.2008, 10:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


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

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



Цитата(Platon @  9.10.2008,  14:41 Найти цитируемый пост)
dzheika, не надо использовать тупые библиотеки, которые не могут работать нормально, или если это ваш код, просто приведите его в порядок. 

а если топик стартер пишет что-нибудь наподобие robocode, где запускаемый код по определению чужой?


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
Platon
Дата 9.10.2008, 10:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Mayk, значит надо долбить саппорт, и говорить, что у них код гнилой.
PM MAIL ICQ   Вверх
SoulKeeper
Дата 9.10.2008, 13:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

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



Нуууу можно попробувать запускать задачи в форковой JVM, на подобии анта при fork=true, ну и грохать другой процесс при таймауте... Только вот это уже зависит от того что задачи должны делать.
PM MAIL   Вверх
COVD
Дата 9.10.2008, 14:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Когда вы делаете запрос из браузера серверу и нет ответа в течении некоторого времени, браузер закрывает соединение и показывает соответствующую страницу об ошибке. А сервер, возможно, в это время продолжает работать над ответом. Аналогично и с задачей в отдельном потоке. Приложение не дождавшись ответа от потока должно продолжать свою работу, а поток может продолжать крутиться (только его результата уже никто не ждет) пока не помрет естественной смертью. Это обычная практика. 

Если же проблема в том, что такой поток сильно нагружает систему и желание его остановить вызвано необходимостью освободить ресурсы компьютера, то разумно изолировать эти потоки ( решающие изолированные задачи да еще с помощью сторонних библиотек ! ) от приложения, а именно перенести в другое приложение или вообще на другую машину, т.е. выделить в отдельный сервис.     

Это сообщение отредактировал(а) COVD - 9.10.2008, 15:00
PM MAIL   Вверх
Dims
Дата 9.10.2008, 20:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Что-то возникают сомнения, что stop() не останавливает поток. В документации ясно написано, что поток останавливается и все мониторы освобождаются. 

Вероятно, проблема в чём-то другом, например, в правильном возобновлении работы других потоков после остановки вредителя или в нарушении целостности тех данных, с которыми работал поток-вредитель.

Добавлено через 6 минут и 4 секунды
Из текста программы я вижу, что поток захватывает монитор на объект thread, что и является причиной зависания.

Метод stop работаем внутри synchronized(this), то есть, он не может даже начать работу.

Вообще, захватывать монитор на объект потока это нехарактерно. 

Вот такой код работает:

Код

public class Test01 {
    public static void main(String[] args) throws Exception {

        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println("started");
                    while (true) {
                        ;
                    }
            }
        };
        thread.start();
        Thread.yield();
        thread.stop(); //deprecated, unsafe
        System.out.println("stoped");
    }
}


Добавлено через 7 минут и 49 секунд
Можно ещё вот так переписать:

Код

public class Test01 {
    public static void main(String[] args) throws Exception {

        Thread thread = new Thread() {
            @Override
            public void run() {
                System.out.println("started");
                synchronized (this) {
                    while (true) {
                        ;
                    }
                }
            }
        };
      
      Thread thread2 = new Thread(thread);
        thread2.start();
        Thread.yield();
        thread2.stop(); //deprecated, unsafe
        System.out.println("stoped");
    }
}

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

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

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


 




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


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

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