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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> обить поток... как правильно убивать... 
:(
    Опции темы
sith
Дата 10.4.2007, 20:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



.... нужно убить поток... что бы он полностью загнулся и перстал существовать... 
...на вызов фунции ... <поток>.stop();      компилятор предупреждает.... -uses or overrides a deprecated API... что это... и чем это мне грозит...


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
powerOn
Дата 10.4.2007, 20:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


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

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





--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Vasay
Дата 11.4.2007, 00:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Можно убить поток вызвав thread.join(1); -умрет через 1 милисекунду.
Код

join(long millis)
          Waits at most millis milliseconds for this thread to die.
join(long millis, int nanos)
          Waits at most millis milliseconds plus nanos nanoseconds for this thread to die.


Но это не лучший способ. ИМХО лучше чтоб поток завершал себя сам. Можно создать переменную в потоке (например boolean ThreadRun = true), которая доступна из вне, и если надо убить поток, то поставить эту переменную в false (Хорошо бы чтоб это делал метод setThreadRun(boolean)), а поток во время работы проверял бы состояние этой переменной, и если она false, завершался бы.


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
w1nd
Дата 11.4.2007, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Цитата(Vasay @  11.4.2007,  00:39 Найти цитируемый пост)
Можно убить поток вызвав thread.join(1);

 smile 


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


Шустрый
*


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

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



Цитата

Можно убить поток вызвав thread.join(1); -умрет через 1 милисекунду.


Сам то, нибось так поток не останавливаешь.  smile Зачем про него вобще вспоминал-ведь не делает так никто-плохой стиль.
PM MAIL   Вверх
LSD
Дата 11.4.2007, 10:43 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Boing747 @ 11.4.2007,  10:01)
Сам то, нибось так поток не останавливаешь.  smile Зачем про него вобще вспоминал-ведь не делает так никто-плохой стиль.

Thread.join() - это вполне нормальный стиль, вот только поток он не останавливает.

И вообще господа, может уже пора начать JavaDoc-и читать, а? smile 


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Boing747
Дата 11.4.2007, 11:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



LSD,   smile 

 
Цитата

  Thread.join() - это вполне нормальный стиль, вот только поток он не останавливает.

Thread.join() -конечно нормально и часто испоьзуется, но вот thread.join(1); я ни разу не видел, где используют, уж простите мою неосведомленность  smile. А доки, господа читают  smile , и вопрос звучал про остановку потока.
(Не в обиду сказанно)

Это сообщение отредактировал(а) Boing747 - 11.4.2007, 11:08
PM MAIL   Вверх
Metal_Heart
Дата 11.4.2007, 13:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


а почему бы и нет?
**


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

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



если бы sith прошелся поиском по форуму, то понял бы, что убить поток из-вне можно только убив саму jvm.

кажется так, или я не прав?


--------------------
 не стыдно учиться, а стыдно не учиться 
PM ICQ   Вверх
Vasay
Дата 11.4.2007, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Честно, считал что вызов join(long millis) - ждет максимум millis милисекунд, и если поток за это время не завершился, то его убивают.  Судя по всему я был неправ. 

Цитата

Сам то, нибось так поток не останавливаешь.  smile


Не не останавливаю  smile  Как я останавливаю потоки я написал в том же посте.


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
FlasH
Дата 12.4.2007, 09:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А что делать когда тред встал на read() ?

Код

while (!needToStop()){
    byte[] header = new byte[HEADER_LENGTH];
    for (int i=0;i<HEADER_LENGTH;i++)
        header[i] = (byte) socket.getInputStream().read();
}

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


Эксперт
****


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

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



Цитата(FlasH @ 12.4.2007,  09:53)
А что делать когда тред встал на read() ?

Код

while (!needToStop()){
    byte[] header = new byte[HEADER_LENGTH];
    for (int i=0;i<HEADER_LENGTH;i++)
        header[i] = (byte) socket.getInputStream().read();
}

Выставлять timeout для сокета...


--------------------
Придумать идеальную защиту от дурака невозможно, дураки, наудивление, изобретательны.
PM MAIL   Вверх
LSD
Дата 12.4.2007, 11:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(FlasH @  12.4.2007,  09:53 Найти цитируемый пост)
А что делать когда тред встал на read() ?

Для некоторых потоков, можно вызвать interrupt() у треда.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
kkorsakoff
Дата 12.4.2007, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



А почему для некоторых? В каких-то случаях так делать нельзя? 

Просто я всегда использовал interrupt(), будет интересно узнать, если так не всегда можно поступать.
PM MAIL WWW ICQ   Вверх
LSD
Дата 12.4.2007, 12:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Вот что написано в JavaDoc по interrupt():
Цитата
If this thread is blocked in an I/O operation upon an interruptible channel then the channel will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException.

Файловые и сетевые каланы - interruptible, но в принципе могут быть каналы, которые не interruptible.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
sith
Дата 13.4.2007, 14:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



 Thread.join()  - метод который останавливает поток до его удаления... так написано в АПИ... если я все правильно понял...???


--------------------
Там где ты ставишь глупые смайлики, я вбиваю восклицания знаки!!!
PM MAIL   Вверх
LSD
Дата 13.4.2007, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Thread.join() - останавливает текущий поток, до тех пор пока не остановится тот поток у которого был вызван join(). Например:
Код
public boolean excute(Runnable task)
{
  Thread thread = new Thread(task);
  thread.start();
  try
  {
    thread.join(10 * 1000);
  }
  catch(InterruptedException e)
  {
    return false;
  }
  return true;
}

будет создан еще один поток, в котором будет запущена некая задача. Далее текущий поток будет ждать 10 секунд завершения этой задачи, если дождется, то вернет true иначе false.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
kkorsakoff
Дата 13.4.2007, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(LSD @ 12.4.2007,  12:04)
Вот что написано в JavaDoc по interrupt():
Цитата
If this thread is blocked in an I/O operation upon an interruptible channel then the channel will be closed, the thread's interrupt status will be set, and the thread will receive a ClosedByInterruptException.

Файловые и сетевые каланы - interruptible, но в принципе могут быть каналы, которые не interruptible.

Это понятно, а на практике?
PM MAIL WWW ICQ   Вверх
Boing747
Дата 13.4.2007, 15:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Цитата

 Thread.join()  - метод который останавливает поток до его удаления... так написано в АПИ... если я все правильно понял...???


Этот метод используют для того, чтобы дождаться пока остальные потоки не остановятся. 

Код


class MyThread implements Runnable {
      String name; // name of thread

      Thread t;

      MyThread(String threadname) {
        name = threadname;
        t = new Thread(this, name);
        System.out.println("New thread: " + t);
        t.start();
      }

      public void run() {
        try {
          for (int i = 5; i > 0; i--) {
            System.out.println(name + ": " + i);
            Thread.sleep(1000);
          }
        } catch (InterruptedException e) {
          System.out.println(name + " interrupted.");
        }
        System.out.println(name + " exiting.");
      }
    }

    public class Test {
      public static void main(String args[]) {
        MyThread ob1 = new MyThread("One");
        MyThread ob2 = new MyThread("Two");
        MyThread ob3 = new MyThread("Three");

        System.out.println("Thread One is alive: " + ob1.t.isAlive());
        System.out.println("Thread Two is alive: " + ob2.t.isAlive());
        System.out.println("Thread Three is alive: " + ob3.t.isAlive());

        try {
          System.out.println("Waiting for threads to finish.");
          ob1.t.join();
          ob2.t.join();
          ob3.t.join();
        } catch (InterruptedException e) {
          System.out.println("Main thread Interrupted");
        }

        System.out.println("Thread One is alive: " + ob1.t.isAlive());
        System.out.println("Thread Two is alive: " + ob2.t.isAlive());
        System.out.println("Thread Three is alive: " + ob3.t.isAlive());

        System.out.println("Main thread exiting.");
      }
    }


Здесь в мэйне ждем завершения потоков
Код

 ob1.t.join();
 ob2.t.join();
 ob3.t.join();


пока они не остановятся ничего не происходит.
PM MAIL   Вверх
LSD
Дата 13.4.2007, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(kkorsakoff @  13.4.2007,  15:21 Найти цитируемый пост)
Это понятно, а на практике?

Код
Runnable target = new Runnable()
{
  public void run()
  {
    try
    {
      FileChannel in = new FileInputStream("DISK1.mdf").getChannel();
      FileChannel out = new FileOutputStream("DISK2.mdf").getChannel();
      try
      {
        in.transferTo(0L, in.size(), out);
      }
      catch(IOException e)
      {
        e.printStackTrace();
      }
      in.close();
      out.close();
    }
    catch(IOException e)
    {
    }
  }
};
Thread thread = new Thread(target);
thread.start();
Thread.sleep(1);
thread.interrupt();



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

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

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


 




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


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

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