Java/Wildfly:线程堆积/Eclipse 为每个请求显示一个额外的 运行 线程
Java / Wildfly: Threads piling up / Eclipse shows one additional running thread for each request
我正在使用 javas Thread
通过 SMTP 连接到我们的邮件提供商,因为这可能需要一些时间才能完成,我不希望请求等待。
但是好像线程结束后并没有关闭。
我在 Eclipse 的调试模式中注意到了这一点:
每次我创建一个 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 中意味着不同的东西?
我建议不仅要用调试器看,还要看你在某个时间点有哪些线程。调试器可能会显示在断点期间处于活动状态但在正常情况下不应存在的线程。
最好使用命令行工具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 Whosebug.ThreadReferenceTest.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
我正在使用 javas Thread
通过 SMTP 连接到我们的邮件提供商,因为这可能需要一些时间才能完成,我不希望请求等待。
但是好像线程结束后并没有关闭。 我在 Eclipse 的调试模式中注意到了这一点:
每次我创建一个 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 中意味着不同的东西?
我建议不仅要用调试器看,还要看你在某个时间点有哪些线程。调试器可能会显示在断点期间处于活动状态但在正常情况下不应存在的线程。
最好使用命令行工具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 Whosebug.ThreadReferenceTest.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