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


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

Автор: powerOn 10.4.2007, 20:13
http://forum.vingrad.ru/index.php?showtopic=144779&st=0&anchor=entry1089069

Автор: Vasay 11.4.2007, 00:39
Можно убить поток вызвав 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, завершался бы.

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

 smile 

Автор: Boing747 11.4.2007, 10:01
Цитата

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


Сам то, нибось так поток не останавливаешь.  smile Зачем про него вобще вспоминал-ведь не делает так никто-плохой стиль.

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

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

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

Автор: Boing747 11.4.2007, 11:06
LSD,   smile 

 
Цитата

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

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

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

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

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

Цитата

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


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

Автор: 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();
}

Автор: Vasay 12.4.2007, 10:10
Цитата(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 для сокета...

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

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

Автор: kkorsakoff 12.4.2007, 11:54
А почему для некоторых? В каких-то случаях так делать нельзя? 

Просто я всегда использовал interrupt(), будет интересно узнать, если так не всегда можно поступать.

Автор: 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.

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

Автор: LSD 13.4.2007, 15:14
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.

Автор: kkorsakoff 13.4.2007, 15:21
Цитата(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.

Это понятно, а на практике?

Автор: Boing747 13.4.2007, 15:27
Цитата

 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();


пока они не остановятся ничего не происходит.

Автор: LSD 13.4.2007, 15:42
Цитата(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();

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