当前位置: 首页 > 知识库问答 >
问题:

当线程没有抛出异常时会发生什么?

凌宏大
2023-03-14

我注意到,在这个javadoc中,https://docs.oracle.com/javase/7/docs/api/java/lang/Thread.UncaughtExceptionHandler.htmlUncaughtExceptionHandler用于发生异常但未被捕获的情况。但是,那个线程会悄悄地失败吗?我想是的,因为它是异步进行业务的,但我正在调查我们的一个进程的相关问题,我很惊讶现在才意识到这一点,我的职业生涯已经10年了。

共有3个答案

单于亮
2023-03-14

我终于弄清了我的具体问题。这是由于错误处理不当,导致线程悄悄失败:

public class Main {

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread() {

            public void run() {
                try {
                    //do some stuff
                } catch (Exception e) {
                    e.printStackTrace();
                }
                System.out.println("done-worker thead");
                throw new RuntimeException("purposeful!");
            }
        };
        t.setUncaughtExceptionHandler(
                (thread, throwable) -> System.out.println("main thread; uncaugh exception from worker threadt: " + throwable.getMessage()));
        t.start();
        TimeUnit.SECONDS.sleep(10);
        System.out.println("done-main thead");
    }
}

在做“一些事情”时,应用程序遇到了OutOfMemoryError,严格来说,这不是一个例外。将上述内容更改为catch(Throwable t),解决了此问题。

尉迟京
2023-03-14

根据@pveentjar的更新答案,我运行了以下代码:

import java.util.concurrent.TimeUnit;

public class Main {

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread() {

            public void run() {
                throw new RuntimeException("purposeful!");
            }
        };
        t.setUncaughtExceptionHandler((thread, throwable) -> System.out.println("uncaught: " + throwable.getMessage()));
        t.start();
        TimeUnit.SECONDS.sleep(10);
        System.out.println("done");
    }
}

,并确定uncaughtExceptionHandler似乎从使用它的线程中捕获了一个异常,允许开发人员对其做他们想做的事情,但这就留下了一个问题,如果不是为了将系统从无声故障中拯救出来,为什么还要使用该处理程序?输出:

uncaught: purposeful!
[a pause of approximately ten seconds]
done
汪博艺
2023-03-14

线程会悄悄地失败:)

十多年前,a遇到了类似的问题。随着时间的推移,系统的性能开始下降。最后,我确定了原因:在某个自定义线程池中的工作线程中引发了一个异常,工作线程被终止。因此,随着时间的推移,线程池中的活动线程数量开始减少,性能下降。

问题隐藏在没有记录异常的事实中。

[编辑]

我上面的回答不正确。以下示例对此进行了演示:

import java.util.concurrent.TimeUnit;

public class Main {

    public static void main(String[] args) throws InterruptedException {
        Thread t = new Thread(){
            public void run(){
                throw new RuntimeException();
            }
        };
        t.start();
        TimeUnit.SECONDS.sleep(10);
        System.out.println("done");
    }
}

运行代码时,显示以下输出:

Exception in thread "Thread-0" java.lang.RuntimeException
    at Main$1.run(Main.java:8)
done

因此,将记录异常。

 类似资料:
  • 该文件指出 Lambda函数可能由于以下任何原因而失败: 函数在尝试到达终结点时超时。 函数无法成功解析输入数据。 该函数会遇到资源限制,例如内存不足错误或其他超时。 我的问题:如果我使用SQS Lambda集成(.NET) 我的函数引发异常 我的SQS可见性计时器设置为15分钟,最大接收计数为1,DLQ设置 函数会重试吗?当所有重试后抛出异常时,它会放入DLQ吗?

  • 问题内容: 假设我将Sun的JVM嵌入C ++应用程序中。通过JNI,我调用了Java方法(我自己的),该方法又调用了我在共享库中实现的本机方法。 如果此本机方法抛出C ++异常,会发生什么? 编辑:编译器是gcc 3.4.x,jvm是sun的1.6.20。 问题答案: 在JNI文献中,“ 异常 ”一词似乎专门用于指代Java异常。本机代码中发生的意外事件称为 编程错误 。JNI明确不需要JVM检

  • 抛出异常的行为是否可能抛出不同的异常? 为了抛出异常,必须(可选地)分配新对象,并调用其构造函数(隐式调用fillinstacktrace)。在某些情况下,听起来像addSupressed也被称为。那么如果没有足够的内存会发生什么呢?JVM是否需要预分配内置异常?例如,(1/0)会抛出OutOfMemoryError而不是ArithmeticException吗? 此外,构造函数是一个方法调用,因

  • 我的项目使用apache超文本传输协议客户端向超文本传输协议服务器发送超文本传输协议请求。但是奇怪的事情发生了。我设置连接超时为10秒,套接字超时为10秒。对于每一天,大多数请求时间(大约100个请求)是100ms-200ms,但是左(大约10个请求)将抛出连接超时异常,这意味着连接建立时间是10s以上。我不知道发生了什么。 我的电话是: HttpUtils。post(主机,空,参数,“UTF-8

  • 我在其中一个POJO中使用javax.validation.constraints.NotNull,如下所示: 然后,即使我为两个字段都使用 null 值制作 Abc 的对象,它也不会引发任何异常。知道为什么吗? 例如。 不会抛出任何异常。

  • 来自文档:http://docs.python.org/2/library/thread 让我们在这里只讨论非守护进程线程。因为第一个引号没有特别提到非守护进程线程,所以我假设,如果主线程退出,即使是非守护进程线程也应该被杀死。然而,第二句引文却表明了另一种情况。事实上,当主线程退出时,非守护进程线程确实不会被杀死。那么,这里的第一个引用有什么意义呢?