【问题标题】:How do I terminate parent thread from child?如何终止子线程的父线程?
【发布时间】:2015-04-27 10:18:20
【问题描述】:

如何从创建我的主线程的子线程中终止父(主)线程?我试过 System.exit(1) 但它只终止子线程。我也尝试在 main 的 while 循环中设置一个条件,但它显然会在退出之前尝试读取 1 个额外的输入。

public static void main(String[] args) throws IOException
{
    new Thread(new Runnable() 
    { 
      public void run() 
      { 
        while(true) 
        { 
            //meet a condition then terminate
        } 
      } 
    }).start(); 
    while (true)
    {
        String a = input.nextLine();
        //do something with input
    }
}

【问题讨论】:

  • System.exit(1) 终止所有个线程。要回答您的问题,您不能 - input.nextLine阻塞不可中断,因此一旦您开始等待输入,您就无法停止。
  • 如果我反其道而行之,在 main 的 while 循环中调用 System.exit(1),它会终止子进程吗?
  • 来自the documentation终止当前运行的Java虚拟机。 System.exit退出整个JVM。 所有线程退出。 JVM 终止。就是这样。在任何情况下你都不应该使用它——它几乎没有一个好的用例。
  • B.T.W.,“父”和“子”在 Java 线程中没有意义。线程 groups 可以有父/子关系,并且每个 Thread 都属于一个 ThreadGroup,但是如果线程 A 创建线程 B,则库不会授予任何一个线程任何特殊权限或与另一个,也不记得是哪个创造了哪个。

标签: java multithreading concurrency exit


【解决方案1】:

你不应该这样做。从该线程外部终止任何线程是一个非常糟糕的主意。这是因为终止线程不知道目标在做什么以及它是否在“安全”点终止。例如,您可能正在编写输出、进行计算或其他任何事情。

相反,您应该向另一个线程发送信号(使用多种方式中的任何一种),然后该线程自行退出。要退出线程,只需从线程的 run 方法返回即可。

【讨论】:

  • 感谢您的解释。我可能不得不尝试一种不同的方式让服务器在可以安全退出时向客户端发出信号。当客户端首先退出时,我总是遇到一些套接字绑定异常。另外,如果我结束父(主)线程,它会终止子线程吗?
【解决方案2】:

从子线程中杀死 Thread 这不是一个好习惯,但您可以对子线程进行编程以从父线程更新字段。如果此字段不为 null,则父级应停止。

还有take a look to this question

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-27
    • 2011-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-02
    • 2014-03-12
    • 2019-01-27
    相关资源
    最近更新 更多