gpt4 book ai didi

Java/野蝇: Threads piling up/Eclipse shows one additional running thread for each request

转载 作者:行者123 更新时间:2023-12-02 11:59:00 25 4
gpt4 key购买 nike

我正在使用javas Thread通过 SMTP 连接到我们的邮件提供商,因为这可能需要一些时间才能完成,而且我不希望请求等待。

但是看起来线程完成后并没有关闭。我在 Eclipse 的 Debug模式中注意到了这一点:

每次我创建 new Thread() ,它添加了一个正在运行的线程,但它没有关闭它(至少我假设这一点,因为 eclipse 仍然显示 Running )。

这是我的代码:

             Thread mailThread = new Thread() {

public void run() {

System.out.println("Does it work?");

try {
Transport t = session.getTransport("smtp");
t.connect("user","pass");
t.sendMessage(message,message.getAllRecipients());
t.close();
System.out.println("SENT");
return;
} catch (MessagingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
return;
}
}
};

mailThread.start();

这是否按预期工作?或者Running在 eclipse 中意味着不同的东西?

最佳答案

我建议不仅要使用调试器来查看,还要查看在某个时间点有哪些线程。调试器可能会显示在断点期间处于 Activity 状态的线程,但在正常情况下不应存在。

最好使用命令行工具jstack来创建线程转储。这将在某个时间点转储 JVM 中的所有线程。

以下是有关如何使用它的一些说明:https://helpx.adobe.com/uk/experience-manager/kb/TakeThreadDump.html

另一件事可以帮助您调试和查找转储中的线程:使用构造函数之一中的字符串为线程命名。

new Thread("foo")

然后在线程转储中找到这些就变得更容易了。

如果您调用线程“foo”,那么它将显示在线程转储中,如下所示:

"foo" #16 prio=5 os_prio=0 tid=0x0000000041970800 nid=0x41f8 waiting on condition [0x000000004244e000]
java.lang.Thread.State: TIMED_WAITING (sleeping)
at java.lang.Thread.sleep(java.base@9/Native Method)
at stackoverflow.ThreadReferenceTest$1.run(ThreadReferenceTest.java:14)

Locked ownable synchronizers:
- None

"Service Thread" #15 daemon prio=9 os_prio=0 tid=0x0000000041914000 nid=0x3d90 runnable [0x0000000000000000]
java.lang.Thread.State: RUNNABLE

Locked ownable synchronizers:
- None

关于Java/野蝇: Threads piling up/Eclipse shows one additional running thread for each request,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47396198/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com