2013-06-15 4 views
2

Я работаю на платформе java android. Я создаю дочерний поток из основного потока. Я хочу остановить дочернюю нить как свои требования. Мой дочерний поток имеет простую функцию, которая не имеет никакого цикла. Я хочу убить дочерний поток и свободные ресурсы, которые он использует, когда захочу. Я искал его, и я нашел inturrupt() function.my нить:Killing child thread from parent thread in java

public class childThread implements Runnable{ 
    public void run() { 
    firstFunction(); 
    secondFunction(); 
    } 
} 

Основной поток имеет этот код, чтобы начать выше резьбы:

Thread tChild; 
tChild = new Thread(new childThread(), "Child Thread"); 
tChild.start(); 

моего бега() функция вызова функции, как это , Как я могу использовать inturrupt() в этом? Скажите, пожалуйста, любой другой способ убить дочерний поток и освободить его ресурсы. Спасибо.

+0

Я отредактировал свой вопрос и дал код, как я начинаю дочернюю нить. – navalp3

ответ

3

С сотрудничеством волоском, вы можете остановить этот поток, используя любой метод, который он поддерживает. Без сотрудничества нитей нет разумного способа остановить его. Рассмотрим, например, если поток содержит блокировку и поместил общий ресурс в недопустимое состояние. Как вы можете остановить эту тему без сотрудничества?

У вас есть два варианта:

  1. Кодовые ваши потоки так, что они не делают работу, которую вы не хотите, чтобы они делали. Кодируйте их так, чтобы они прекращали себя, когда у них нет работы. Таким образом, им не понадобится какая-то другая нить, чтобы «достичь» снаружи.

  2. Измените свои темы, чтобы они предоставили какой-то способ сказать, что они должны закончиться, а затем они прекратятся чисто.

Но это ваш выбор - он не может работать по волшебству.

Подумайте, как нить выполняет работу, как ваша сестра, заимствуя вашу машину. Если вам нужна машина назад, вам нужно сотрудничество вашей сестры, чтобы вернуть ее. Вы можете устроить так, чтобы она вернулась, когда вам нужна машина сама, или вы можете договориться, чтобы вы сказали ей, когда вам нужна машина, а затем она вернется. Но вы не можете изменить тот факт, что она должна знать, как вернуть машину или она не вернется.

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

0

Ваш дочерний поток должен будет регулярно проверять Thread.interrupted() и выходить, если он возвращает true.

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

+0

Как проверить Thread.interrupted() ?? Я не использую ни одного цикла. – navalp3

+0

Все, что мы можем здесь сделать, это повторить то, что говорится в документации о прерванном потоке, поэтому см. Эту ссылку [http://developer.android.com/reference/java/lang/Thread.html#interrupt()) –

0

Просто позвоните прерывают на объект tChild и прервет ваш ребенок нить

Thread tChild; 
tChild = new Thread(new childThread(), "Child Thread"); 
tChild.start(); 
//... 
tChild.interrupt(); 
+1

да он будет inturrupt дочерний поток, но я не могу проверить tChild.interruped() каждый раз, тогда как я остановлю этот поток ??? – navalp3

2

Как вы не имеете цикл, где проверить значение Thread.interrupted(), и я полагаю, что ваш firstFunction() ; secondFunction(); выполнить тяжелую работу, вам нужно будет проверить соответствующие пункты внутри функции firstFunction(); secondFunction(); условие Thread.interrupted() и закончить метод, если true. Я знаю, что у вас нет петель, но концептуально будет что-то вроде этого,

Runnable runnable = new Runnable() { 
     private int counter; 

     public void run() { 
     while(true){ 
      System.out.println(">> Executing " + counter++); 

      if(Thread.interrupted()){ 
      break; 
      } 
     } 

     } 
    }; 

    Thread thread = new Thread(runnable); 
    thread.start(); 

    Thread.sleep(10 * 1000); 

    thread.interrupt(); 
+0

где я помещаю firstFunction() и secondFunction(), если я пытаюсь использовать его ... ??? – navalp3

+0

Внутри 'public void run() {firstFunction(); secondFunction();} '. Сделайте 'if (Thread.interrupted()) {...}' внутри ваших функций в считанных вами точках, чтобы остановить функции, если дочерний поток был прерван. –

+0

Я хочу сказать .. внутри цикла или из него ... если я запишу внутри цикла, тогда он проверяет прерывание только один раз перед выполнением firstFunction() и secondFunction(), и эти функции будут выполняться снова и снова. если я выставляю функции из while, тогда нет смысла использовать прерывание(). – navalp3

0

Окружайте свой код с помощью try catch. Поймать для InterruptedException, а затем выйти. Если есть циклы, поместите оператор catch вне цикла/разрывая петлю, если улов внутри.

Runnable runnable = new Runnable() { 
     public void run() { 
      try { 
       while(true) { 
        // your code 
       }     
      }(InterruptedException e) { 
       // It comes out 
      } 
}