Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Java: Общие вопросы > остановка потока |
Автор: barin_Student 24.4.2008, 13:49 | ||
Все что нашел в поисковике , и все что висит внизу темы , я читал , и пробывал.. но есть одно ,но это все одно и тоже , но у меня не выходит.. Какими способами можно убить поток, исключая: переменную , которая говорит о том что пора выходить из цикла run()? Могу привести строки своего потока , если он потребуется, кто может пояснить , почему после stop()(знаю что так не хорошо останавливать потоки), не запускаеться поток таким вот видом:
![]() |
Автор: barin_Student 24.4.2008, 14:06 | ||
Да на том примере что я привел - он пустой, но у меня на чтение данных порой поток вешаеться , и если я выставлю переменную , толку будет? Вот моя задачка , как реализованна, вот на ней можно будет поиграцца:
|
Автор: Kangaroo 24.4.2008, 14:12 | ||
Читаешь данные, проверяешь переменнею, опять читаешь, проверяешь переменненую......... |
Автор: ivg 24.4.2008, 14:16 |
можно ещё поэкспериментировать с interrupt(); А что значит повиснуть? Несанкционированное повисание потока - это баг, надо его лечить. Если имеется ввиду блокирование потока в ожидании завершения IO операций, то в таких случаях предусматривают таймауты. |
Автор: barin_Student 24.4.2008, 14:16 | ||||
Если так:
|
Автор: SoulKeeper 24.4.2008, 14:44 | ||
Тогда уже:
|
Автор: Бонифаций 24.4.2008, 14:47 |
если зависает где то на чтении - не поможет.. А вообще трассировку делали? где виснет то? |
Автор: barin_Student 24.4.2008, 14:48 | ||||
Добавлено через 2 минуты и 20 секунд
по своему примеру , я могу еще добавить один класс , и указать где , и могу сказать почему виснет. Если надо , то могу запостить. Это паралельный вопрос , но основной , - это как мне остановить поток при такой ситуации? |
Автор: barin_Student 25.4.2008, 05:31 |
Ниужели нельзя stop() , а далее заново запустить? С критическими данными этот поток не работает. |
Автор: Vurn 25.4.2008, 06:48 |
Автору - для этого существует два метода. Первый - Socket.setSoTimeout(time); Сокет держится в read только указанное время, если данные не получены - выходит с длиной 0, и можно по циклу проверть. Второй Thread.interrupt(); Он рвет состояния чтения указанной нити. read тоже выходит из режима ожидания с длиной 0. |
Автор: barin_Student 25.4.2008, 07:00 |
Счас проверю и посмотрю, но ведь не всегда поток на чтение зависает , , и у меня не сокет , а ком порт., но все равно посмотрю. |
Автор: le_chat 25.4.2008, 11:06 |
Была подобная проблема. Вариант с Thread.interrupt() я не рассматривал, ибо вроде как по описанию при блокирующем вводе-выводе он не поможет. Для se - io операция будет прервана только nio пакета. Есть конечно шанс что внутри реализации, скажем, блокирующего чтения поток вести на wait'е, тогда конечно все должно сработать. Для me nio вообще не предусмотренно, поэтому все решалось закрытием читающего стрима из внешнего трэда. Его вставлял в shouldStop() и закрывал после установки стоп-флага потока. Тогда read() переставал ждать данные и возвращал -1, и run() нормально завершался по стоп флагу. Могу предложить менее красивый и более ограниченный вариат: выставить для читающего потока setDemon(true). Это возможно и не решит проблемы с высвобождением ресурсов, но позволит завершить родительский поток (другими словами - позволит завершить приложение даже если читающий поток не завершился. jvm тоже завершится. Поэтому возможно ресурсы и будут высвобождены). ![]() |
Автор: barin_Student 25.4.2008, 11:17 | ||||
Поток у меня итак демон, и хорошо что он основной тред не останавливает.. Скажем я поток , который хочу чтоб он сдох делаю так: вот скажем поток который нам надо стопнуть , а затем заного запустить
вот отсюдова:
|
Автор: SoulKeeper 25.4.2008, 16:14 | ||||||||
Или цель стоит сделать максимально заумно? |
Автор: Vurn 25.4.2008, 16:37 |
Кстати, никто не мешает, по идее, сделать проверку через .ready() на наличие доступных символов для чтения и, если символы есть - прочесть их в массив. Если ничего нет - отправить в сон не надолго. |
Автор: barin_Student 26.4.2008, 08:26 | ||
Я так и сделал, сорри что не сказал.. Проверяю перед чтением на ready(), если нет то три раза жду и выхожу из цикла. |