java - 当它创建的线程死亡时,进程是否会死亡?
问题描述
我在 Java 中有一个具有 main() 函数的类。我们称它为 A。还有另一个类 B 实现了 Runnable 接口。在 A 类的主函数中,我创建了 B 类的线程,该线程将开始执行其逻辑。
现在,如果让我们说因为某些错误,B 类的线程就死了。那么进程A会随之死亡吗?如果不是,当 B 类的线程死亡时,我们如何让进程 A 死亡。
反之亦然,比如如果进程 A 死了,那么 B 类的线程会随之死去吗?如果不是如何让它死?
解决方案
您的问题是关于如何捕获子线程的异常并在父线程中引发它的主题。
从技术上讲,就像另一个答案一样,子线程中的中断确实在父线程中引发了异常之间没有关系。
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 Runnable
orCallable
做等价物并查看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
考虑看看这个问题
推荐阅读
- amazon-web-services - ALB 目标组显示不健康,但我的应用程序运行良好
- mysql - 如何使用 FIND_IN_SET 使用数据列表
- html - 为什么提交刷新页面
- reactjs - React将数组名称转换为普通句子
- c# - 如何使用 Linq 生成 5 个数字的组合,一次取 3 个而不重复?
- javascript - vue2-datepicker 如何使用模糊(或任何其他事件)检查值
- node.js - Koa.js:ctx.setcookie() 设置 cookie 失败
- http - 如何通过 Nginx Ingress 上的 X-Forwarded-For 标头限制访问?
- scala - 正则表达式与数据框列值匹配
- postgresql - PostgreSQL 复制流在 aws rds 中停止