我使用javas Thread
通过SMTP连接到我们的mailprovider,因为这可能需要一些时间才能完成,我不希望请求等待。
但看起来线程在完成后没有关闭。 我在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
意味着什么不同?
答案 0 :(得分:1)
我建议不仅要使用调试器来查看,以查看您在某个时间点有哪些线程。调试器可能会显示在断点期间处于活动状态但在正常情况下不应存在的线程。
最好使用命令行工具 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