首页 > 解决方案 > 当它创建的线程死亡时,进程是否会死亡?

问题描述

我在 Java 中有一个具有 main() 函数的类。我们称它为 A。还有另一个类 B 实现了 Runnable 接口。在 A 类的主函数中,我创建了 B 类的线程,该线程将开始执行其逻辑。

现在,如果让我们说因为某些错误,B 类的线程就死了。那么进程A会随之死亡吗?如果不是,当 B 类的线程死亡时,我们如何让进程 A 死亡。

反之亦然,比如如果进程 A 死了,那么 B 类的线程会随之死去吗?如果不是如何让它死?

标签: javamultithreadingprocess

解决方案


您的问题是关于如何捕获子线程的异常并在父线程中引发它的主题。

从技术上讲,就像另一个答案一样,子线程中的中断确实在父线程中引发了异常之间没有关系。

public static void main(String[] args){
 
  Thread child = new Thread(){
    public void run () {
            try {
                Object obj = null;
                String s = obj.toString(); //this will throw NullPointer
            } catch (NullPointerException e) {
                throw new RuntimeException("Hoping this reaches the parent! as NPE but it wont", e);
            }
        }
  };
  child.start();
}

但是,要回答您有关如何去做的问题。您可以使用Future<?>and have a RunnableorCallable做等价物并查看Future Result

这是一个可以调用的示例doSomething()

void doSomething(){
  Object s = null;
  System.out.println("You want to do something here!" +  s.toString()); // This will throw NPE
}

现在假设您想在单独的线程中运行它并捕获异常

ExecutorService executor = Executors.newFixedThreadPool(1);
Future result = pool.submit(this::doSomething());
try {
   result.get();
}catch (ExcecutionException e){
  e.printStackTrace(); //will show null pointer exception 
}

现在,在与 threadPool 不同的线程中运行的函数将引发执行异常,您可以选择在主/父线程中捕获该异常,并在失败时做您喜欢的事情。

希望这会有所帮助!


更新:

为什么从子线程中杀死父线程是不好的做法?

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

关于为什么你甚至应该停止/杀死/终止整个 JVM,从来没有一个好的候选者。除非在我不断掌握 Java 和核心概念的过程中,我从来没有处理过杀死父进程的子进程。

只是为了详细说明,具体来说,实际上没有“子”线程或“父”线程的概念。JVM 甚至也不跟踪哪个线程创建了哪个线程。

它主要基于线程组,例如。“groupA”和“groupB”,只有一个“groupA”创建了“groupB”,JVM知道并跟踪它。

如果你真的想停止 JVM。只需调用System.exit ref.2

考虑看看这个问题


推荐阅读