【问题标题】:throw runTime exception on child thread causing main parent thread to end, why?在子线程上抛出runTime异常导致主父线程结束,为什么?
【发布时间】:2016-02-29 19:59:49
【问题描述】:

在 Android 中,但可以在任何 Java 程序中,我生成一个子线程,它会抛出一个 RunTimeException。代码如下所示:

    new Thread(new Runnable() {
        @Override
        public void run() {

            throw new RuntimeException();
        }
    }).start();

这完全终止了我的应用程序,并出现 FatalException 错误。我以为只有子线程会结束,但主/父线程可以继续?这个假设不正确吗?

【问题讨论】:

  • 在普通java中它不会终止

标签: android multithreading exception-handling


【解决方案1】:

RuntimeException 通常只会杀死线程,但可以杀死程序。其他事情通常是决定因素。需要查看更多代码,但这可能是 androids 在线程中处理异常的问题。

【讨论】:

  • @j2emanue 在你的 Java 主文件中吗?重现了您的问题。
【解决方案2】:

Android 只有主(单)线程。

【讨论】:

    【解决方案3】:

    很确定您可以创建自己的异常并在子线程上执行 stopSelf()。不确定您到底要做什么,或者我举个例子。

    Runnable r = new Runnable()
    {
        public void run() {
        while (/*whatever you want to determine end of thread*/)
        {
            try { // this stuff
            } catch (Exception e) { // exception handling
            }
        }
        stopSelf();
        }
    };
    
    //Thread start code
    

    这应该可以工作并且不会让您的应用崩溃...

    【讨论】:

    • 实际上我只是在询问基本行为。子线程上抛出的运行时异常是否也应该结束父线程?在我对 android 的测试中它这样做但有人在 java 上提到它不是所以我不知道预期的行为是什么。规则是什么?
    • RuntimeException 通常只会杀死线程,但即使在java中也可以杀死程序。其他事情通常是决定因素。需要查看更多代码,但这可能是androids在线程中处理异常的问题。
    • 我明白了,您可以将此作为官方答案以供考虑。
    猜你喜欢
    • 2017-04-15
    • 2012-12-25
    • 2016-11-30
    • 1970-01-01
    • 2015-12-05
    • 1970-01-01
    • 2021-01-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多