从java中的父线程杀死子线程

时间:2013-06-15 11:40:14

标签: java android multithreading

我在java android平台上工作。我正在从主线程创建一个子线程。我想停止子线程作为我的要求。我的子线程具有简单的功能,没有任何循环。我想杀死它所使用的子线程和免费资源,只要我想要。我搜索了它,我发现inturrupt()function.my线程是:

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

主线程有以下代码从上面的线程开始:

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

我的run()函数正在调用这样的函数。我如何使用inturrupt()?请告诉我任何其他杀死子线程和释放其资源的方法。谢谢。

5 个答案:

答案 0 :(得分:4)

通过线程的合作,您可以使用它支持的任何方法来停止该线程。如果没有线程的合作,就没有理智的方法来阻止它。例如,考虑线程是否持有锁并将共享资源置于无效状态。如果没有合作,你怎么能阻止那个线程?

您有两种选择:

  1. 对线程进行编码,以便它们不会执行您不希望它们执行的工作。对它们进行编码,以便在没有工作要做时终止自己。这样,他们就不需要其他一些线程从外面“伸手”了。

  2. 对线程进行编码,以便他们提供一些方法告诉他们应该终止,然后他们干净地终止。

  3. 但那些是你的选择 - 它无法通过魔法发挥作用。

    想想一个像姐姐借车一样的工作。如果你需要回车,你需要你妹妹的合作来取回它。你可以安排,以便她在你需要汽车时回来,或者你可以安排,以便你在需要汽车时告诉她然后她回来。但你不能改变这样一个事实,即她必须知道如何把车带回来或者它不会回来。

    线程操纵进程资源并将它们置于无效状态。他们必须在终止之前修复东西,否则进程上下文将会损坏。

答案 1 :(得分: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();

答案 2 :(得分:0)

您的子线程需要定期检查Thread.interrupted(),如果返回true则退出。

您的代码是否有循环并不重要。您只需在代码执行路径中选择各种点,以查看是否需要取消。

答案 3 :(得分:0)

只需在Child对象上调用中断,它就会中断你的子线程

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

答案 4 :(得分:-1)

使用try catch环绕代码。 然后出现Catch for InterruptedException。如果有循环,则将catch语句放在循环外/如果catch在内部则中断循环。

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