Java/Wildfly:Threads堆积/Eclipse为每个请求显示一个额外的运行线程

Java/Wildfly:Threads堆积/Eclipse为每个请求显示一个额外的运行线程,java,eclipse,multithreading,wildfly,threadpool,Java,Eclipse,Multithreading,Wildfly,Threadpool,我正在使用javasThread通过SMTP连接到我们的邮件提供商,因为这可能需要一些时间才能完成,我不希望请求等待 但看起来线程在完成后并没有关闭。 我在Eclipse的调试模式中注意到了这一点: 每次我创建一个新线程(),它都会添加一个正在运行的线程,但不会关闭它(至少我假设是这样,正如eclipse仍然显示的正在运行的) 这是我的代码: Thread mailThread = new Thread() { public

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

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

每次我创建一个
新线程()
,它都会添加一个正在运行的线程,但不会关闭它(至少我假设是这样,正如eclipse仍然显示的
正在运行的

这是我的代码:

             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();

这是否按预期工作?或者在eclipse中运行
是否意味着不同

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

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

以下是有关如何使用它的一些说明:

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

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

在使用JavaEE时,不应该像这样手动生成新线程。如果您想在不阻塞的情况下发送电子邮件,请与发送电子邮件的人一起向jms队列发送消息。然后,您可以轻松控制smtp会话的最大数量,并且如果您的电子邮件服务器出现故障,邮件可以在队列中等待重试。或者,只需将您的电子邮件发送到localhost,然后让您的本地mta传递到您尝试发送到的服务器(smarthost)@威尔特:我同意你不应该在JavaEE中产生这样的线程。同时,向本地主机发送电子邮件也是一个好主意。这确实催生了一个新的过程@WillT@gil.fernandes我们正在实施排队系统,但这需要一些时间。我使用了一个承诺解决方案
CompletableFuture.supplyAsync(()->this.send(session,message))现在。这就解决了问题。谢谢你们!