Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Самоубийство потока...


Автор: ShurikA 14.11.2006, 05:23
Может ли поток убить сам себя?
и как?

Автор: skhilkov 14.11.2006, 07:45
Приходит в голову break из цикла ......  smile 

Автор: ShurikA 14.11.2006, 08:03
Цитата(skhilkov @ 14.11.2006,  06:45)
Приходит в голову break из цикла ......  smile

Из какого цыкла? 
Поток не цыкл...

Автор: skhilkov 14.11.2006, 08:09
поток есть пока не выйдет из run(), обычно run() организован как цикл(либо бесонечный, либо выходящий по условию). Поэтому при выходе из цикла поток прекратит существование. 

Автор: ShurikA 14.11.2006, 08:39
Ты имеешь в виду что окончание run() равносильно Thread.Kill()?

Автор: dumb 14.11.2006, 08:50
Цитата(ShurikA @  14.11.2006,  08:39 Найти цитируемый пост)
окончание run() равносильно Thread.Kill()?

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

Автор: skhilkov 14.11.2006, 08:57
ага, либо тебя убили, либо ты своей смертью умер.... но результат один )))

Автор: Sherst 14.11.2006, 11:02
Поток прекратит работу, когда метод run() возвратит управление, а каких-то средств по принудительному завершению выполнения потока нет.
Можно конечно попытаться прервать поток с помощью метода interrupt но он всего лишь запрашивает возможность о прекращении выполнения потока. Когда вызывается данный метод для блокирующего объекта то работа методов wait() и sleep() завершается и генерится исключительная ситуация InterruptedException:

Код

public void run() {
  try { 
     ...........
      while (!interrupted() && работа не закончена) {
         // Выполнение незаконченной работы
      }
     ...........     
  }
   catch (InterruptedException ex) {
      // Работа потока была прервана во время паузы или ожидания
   }
}

Автор: s8e8r8g8e 14.11.2006, 15:29
ага.. только более универсально return из run() делать, а не break, тогда вроде пофиг какая реализация этого run()
а вобще можно и о некоторых "устаревших" методах вспомнить убивающих поток, но это извращение т.к. сам поток может сделать и то что выше написано не прибегая к небезопасным вызовам.

Автор: LSD 14.11.2006, 16:34
Цитата(s8e8r8g8e @  14.11.2006,  15:29 Найти цитируемый пост)
а вобще можно и о некоторых "устаревших" методах вспомнить убивающих поток, но это извращение т.к. сам поток может сделать и то что выше написано не прибегая к небезопасным вызовам.

Лучше не стоит, return гораздо безопасней.

Автор: djGri 15.11.2006, 01:54
Почему не сделать так? (алгоритм и без синхронизации)

Код

public void run() {
if(flag) {
//do something
}

}



Автор: ShurikA 13.12.2006, 19:25
То что я сделал: 
- ловлю Exception в нутри потока
- при этом каждый loop в нутри этого потока проверяет определённый обьект.
- когда мне нужно убить поток - обнуляю обьект.
- в catch сидит return.

и усё.

Автор: powerOn 13.12.2006, 19:49
Цитата(ShurikA @  13.12.2006,  19:25 Найти цитируемый пост)
То что я сделал: 
- ловлю Exception в нутри потока
- при этом каждый loop в нутри этого потока проверяет определённый обьект.
- когда мне нужно убить поток - обнуляю обьект.
- в catch сидит return.

и усё. 


"Месье знает толк в извращениях!"  smile простой break уже не помогает?

Автор: ShurikA 15.12.2006, 03:12
Цитата(powerOn @  13.12.2006,  18:49 Найти цитируемый пост)
простой break уже не помогает? 

по какой то причине break не срабатывает.

Автор: powerOn 15.12.2006, 11:15
Цитата(ShurikA @  15.12.2006,  03:12 Найти цитируемый пост)
по какой то причине break не срабатывает. 

Как так не срабатывает?  smile 
Что на отладчике происходит? Код покажи.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)