Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 当进程创建的线程死亡时,进程是否会死亡?_Java_Multithreading_Process - Fatal编程技术网

Java 当进程创建的线程死亡时,进程是否会死亡?

Java 当进程创建的线程死亡时,进程是否会死亡?,java,multithreading,process,Java,Multithreading,Process,我有一个Java类,它有main()函数。让我们称它为A。还有另一个类B实现可运行接口。在类A的主函数中,我创建了一个类B的线程,该线程将开始执行其逻辑 现在如果说由于某种错误,B类的线程死了。那么过程A会随之消亡吗?如果不是这样的话,当B类线程死亡时,我们如何制作进程A模具 反之亦然,比如若进程A死亡,那个么B类的线程也会随之死亡吗?如果没有,怎么让它死去;一个线程和启动它的线程之间实际上是零关系。它们对彼此没有任何影响。线程与进程也没有任何关系(从ProcessBuilder或Runtime

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

现在如果说由于某种错误,B类的线程死了。那么过程A会随之消亡吗?如果不是这样的话,当B类线程死亡时,我们如何制作进程A模具


反之亦然,比如若进程A死亡,那个么B类的线程也会随之死亡吗?如果没有,怎么让它死去;一个线程和启动它的线程之间实际上是零关系。它们对彼此没有任何影响。线程与进程也没有任何关系(从ProcessBuilder或Runtime.exec开始,与线程没有关系)。

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

从技术上讲,与另一个答案一样,子线程中的中断与父线程中的异常之间没有关系

然而,我想回答你关于如何做的问题。您可以使用
Future
并让
Runnable
Callable
执行等效操作并查看
Future
结果的值

下面的示例可以调用
doSomething()

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

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

现在,在线程池的一个单独线程中运行的函数将抛出一个执行异常,您可以选择在主/父线程中捕获该异常,并根据需要处理该故障

希望这会有所帮助


更新:

为什么从子线程中删除父线程是错误的做法

从线程外部终止任何线程都是一个非常糟糕的主意。这是因为终止线程不知道目标正在做什么,也不知道它是否处于终止的“安全”点。例如,你可能正处于编写输出或计算的过程中。p> 对于为什么要停止/杀死/终止整个JVM,也从来没有一个好的候选者。除非在我不断掌握java和核心概念的过程中,否则我从来没有遇到过子进程杀死父进程的情况

具体地说,实际上没有“子”线程或“父”线程的概念。JVM甚至不跟踪哪个线程创建了哪个线程

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

如果您确实希望停止JVM。只需呼叫
系统。退出


也可以考虑看看这个

不,不是,但还是看看吧。看看我关于如何做的答案,我不想在父进程中捕获异常。若我在子进程中遇到任何异常,我希望父进程死亡。我检查过,当子系统中发生异常时,如果我们记录该异常,然后使用System.exit(),它将同时杀死父系统和子系统。这是个好办法吗?或者会有什么后果?您可以在父进程中捕获异常,然后执行
System.exit()
,这是理想的方法。您不应该从子线程中终止父线程。这是一种不好的做法。你能清楚地解释为什么从孩子身上杀死父母是一种不好的做法吗?或者你只是指向一些资源。这对我会有帮助的。谢谢。@HSReddy更新了答案。你的断言“线程与进程[没有]关系”可能会误导新手。之所以这么说,是因为
java.lang.Thread
类和
java.lang.Process
类之间没有关系。但是,
线程
实例不是线程,
进程
实例也不是进程,在操作系统的上下文中(与讨论某个Java程序相反),线程和进程之间通常有非常紧密的关系。这个问题上的“Java”标记有很多上下文。如果有人想曲解这个答案,把它从上下文中删除,我想我们可以把责任完全放在读者身上。我不是说那些知道得更好的人。我说的是那些来到这个网站寻求知识或解决问题的人。我在这个网站上看到了数百个问题,这些问题的提出正是因为OP在程序中创建并开始运行
线程
实例,而他们实际上并不了解线程到底是什么。是的,如果这些人不根据标签了解上下文,那么他们就注定要失败。
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 
}