【问题标题】:Killing child thread from parent thread in java从java中的父线程杀死子线程
【发布时间】:2013-06-15 11:40:13
【问题描述】:

我在 java android 平台上工作。我正在从主线程创建一个子线程。我想根据我的要求停止子线程。我的子线程具有简单的功能,没有任何循环。我想随时杀死子线程并释放它正在使用的资源。我搜索了它,发现了 inturrupt() 函数。我的主题是:

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

主线程有这个代码来启动上面的线程:

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

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

【问题讨论】:

  • 我已经编辑了我的问题并给出了我如何启动子线程的代码。

标签: java android multithreading


【解决方案1】:

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

你有两个选择:

  1. 对线程进行编码,使它们不会执行您不希望它们执行的工作。对它们进行编码,以便它们在无工作可做时终止自己。这样,他们就不需要其他线程从外部“进入”。

  2. 对您的线程进行编码,以便它们提供某种方式来告知它们应该终止,然后它们干净地终止。

但这些都是你的选择——它不能靠魔法发挥作用。

想象一个线程在工作,就像你姐姐借你的车一样。如果你需要车回来,你需要你姐姐的合作才能把它拿回来。您可以安排让她在您需要汽车时自己回来,或者您可以安排让您在需要汽车时告诉她然后她回来。但是你不能改变这样一个事实,她必须知道如何把车开回来,否则它就回不来了。

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

【讨论】:

    【解决方案2】:

    由于您没有任何循环,因此请检查 Thread.interrupted() 值,我假设您的 firstFunction(); secondFunction();,做繁重的工作,你将不得不检查函数 firstFunction(); 中的适当点。第二函数();条件 Thread.interrupted(),如果为真则结束该方法。我知道你没有循环,但从概念上讲是这样的,

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

    【讨论】:

    • 内部public void run(){firstFunction(); secondFunction();}。如果子线程已被中断,请在您认为必须停止函数的点中在函数中使用if(Thread.interrupted()){...}
    • 我的意思是说..在while循环内或循环外...如果我放在while循环内,那么它只会在执行firstFunction()和secondFunction()之前检查一次中断和这些函数将一次又一次地执行。如果我把函数放在while中,那么使用interrupt()就没有意义了。
    • 在您的情况下,您提到您没有循环。我的循环仅用于概念目的。在您的情况下,您将使用 public void run(){firstFunction(); secondFunction();} 并在 firstFunction() 和 secondFunction() 中检查 Thread.interrupted() 在要检查的点是否线程子已被中断以完成功能。
    • 在这种情况下,中断条件只会在执行开始时检查一次。那么使用中断就没有意义了。
    • @user2409265 - 那么你将不得不通过代码在很多地方检查它。修改您当前的设计计划可能会更好。
    【解决方案3】:

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

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

    【讨论】:

    • 是的,它会中断子线程,但我不能每次都检查 tChild.interruped() 那么我将如何停止该线程???
    【解决方案4】:

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

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

    【讨论】:

    • 如何检查 Thread.interrupted()??我没有使用任何循环。
    • 我们在这里所能做的就是重复文档中关于中断线程的内容,所以请参阅link
    【解决方案5】:

    用 try catch 包围你的代码。 捕获 InterruptedException 然后出来。如果有循环,请将catch 语句放在循环之外/如果catch 在内部则中断循环。

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

    【讨论】:

      猜你喜欢
      • 2017-11-11
      • 2017-01-10
      • 1970-01-01
      • 2010-12-19
      • 1970-01-01
      • 1970-01-01
      • 2011-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多