Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用线程发送邮件,但仍挂起Java应用程序_Java_Multithreading_Email - Fatal编程技术网

使用线程发送邮件,但仍挂起Java应用程序

使用线程发送邮件,但仍挂起Java应用程序,java,multithreading,email,Java,Multithreading,Email,我开发了一个发送电子邮件的应用程序。最初,应用程序在发送邮件时被挂起,因此我想通过线程发送邮件,但即使使用线程发送邮件,我的应用程序在发送邮件时仍然挂起 更新 我已经更新了代码,但在使用join()时仍然存在相同的问题 这是我的代码(为了便于理解线程实现,我缩短了代码) 这是因为发送邮件的代码位于sendMail构造函数中。它根本不会在你的新线程上运行。当您执行new sendMail()时,它会立即在调用线程上运行(在此之后,您的线程启动,实际上什么也不做,因为run()是空的)。您希望该代码

我开发了一个发送电子邮件的应用程序。最初,应用程序在发送邮件时被挂起,因此我想通过
线程发送邮件
,但即使使用线程发送邮件,我的应用程序在发送邮件时仍然挂起

更新

我已经更新了代码,但在使用join()时仍然存在相同的问题

这是我的代码(为了便于理解线程实现,我缩短了代码)


这是因为发送邮件的代码位于
sendMail
构造函数中。它根本不会在你的新线程上运行。当您执行
new sendMail()
时,它会立即在调用线程上运行(在此之后,您的线程启动,实际上什么也不做,因为
run()
是空的)。您希望该代码位于新线程上执行的
run()
,而不是在构造函数中执行


顺便说一下,传统的做法是以大写字母而不是小写字母开头类名。这使它们易于区分(也不会混淆SO的语法高亮)。

这是因为发送邮件的代码位于
sendMail
构造函数中。它根本不会在你的新线程上运行。当您执行
new sendMail()
时,它会立即在调用线程上运行(在此之后,您的线程启动,实际上什么也不做,因为
run()
是空的)。您希望该代码位于新线程上执行的
run()
,而不是在构造函数中执行


顺便说一下,传统的做法是以大写字母而不是小写字母开头类名。这使它们易于区分(也不会混淆SO的语法高亮显示)。

发送邮件的代码必须处于运行状态()


发送邮件的代码必须在run()中



您可能想在sendMail方法中添加代码…顺便问一下,sendMail在您的代码中的什么位置?我只看到sendMail..(您实际上不需要添加代码;您的注释已经足够了。)我看到您更新的代码中存在问题。您正在使用Swing组件。我建议在本例中使用SwingWorker,您也可以使用其中一个,并避免每次创建新线程的开销(例如,线程池或单线程执行器将完成此工作;并且使用与现在相同或更少的代码行-非常容易实现)。您可能想在sendMail方法中添加代码…顺便问一下,sendMail在您的代码中的什么位置?我只看到sendMail..(您实际上不需要添加代码;您的注释已经足够了。)我看到您更新的代码中存在问题。您正在使用Swing组件。我建议在这种情况下使用SwingWorker,您也可以使用其中一个,避免每次创建新线程的开销(例如,线程池或单线程执行器将完成此工作;并且使用与您现在相同或更少的代码行-非常容易实现)。+1还建议将
@Override
添加到
run()
用于清晰性和健全性检查。Nop。它仍然会被挂起来你敢得到一些例外吗?包含的JOptionpane可能会导致此问题。正如我在对你的问题的评论中所说的那样。如果您想更新线程中的接口,或者从邮件发送中提取MessageBox,那么应该使用Swingworker,我将选择第二个。比捕获异常更好的是,将它们抛出到线程调用程序。Ezequiel抱歉,这可能会让您感到恼火,但请查看我更新的代码,我使用了线程的join()。很抱歉我的上一段代码,我认为join()与应用程序挂起无关。如果我删除join()方法和第二个线程。它工作得很好。+1还建议将
@Override
添加到
run()
,以确保清晰性和合理性检查。Nop。它仍然会被挂起来你敢得到一些例外吗?包含的JOptionpane可能会导致此问题。正如我在对你的问题的评论中所说的那样。如果您想更新线程中的接口,或者从邮件发送中提取MessageBox,那么应该使用Swingworker,我将选择第二个。比捕获异常更好的是,将它们抛出到线程调用程序。Ezequiel抱歉,这可能会让您感到恼火,但请查看我更新的代码,我使用了线程的join()。很抱歉我的上一段代码,我认为join()与应用程序挂起无关。如果我删除join()方法和第二个线程。而且,类名通常是名词,而不是形容词或动词。如果该类的名称为
AsyncMailSender
或类似的名称,听起来会更好。@javadunk那么还有其他一些事情您没有告诉我们,或者您在其他地方遗漏了一些东西,因为这是实现此功能的正确方法。你将不得不做一些工作来缩小正在发生的事情。添加调试
System.out.println
语句以跟踪整个执行过程,或者在调试器中运行,可以给您一些很好的提示。也打印出你的例外情况;您是否正在挂起对话框?Jason抱歉,可能会让您感到恼火,但请查看我使用的线程join()的更新代码。很抱歉我的上一段代码,我认为join()与应用程序挂起无关。如果我删除join()方法和第二个线程。它工作得很好,你真的应该先表现出来;有了
join()
,仅修复
run()
本身不足以解决问题(两者都是问题的原因)。如果你阅读了文档,它会很明显。而且,类名通常是名词,而不是形容词或动词。如果该类的名称为
AsyncMailSender
或类似的名称,听起来会更好。@javadunk那么还有其他一些事情您没有告诉我们,或者您在其他地方遗漏了一些东西,因为这是实现此功能的正确方法。你将不得不做一些工作来缩小正在发生的事情。添加调试
System.out.pr
boolean wasMailSent = false;
public void sendMyMail()
{
    Thread sendEmail = new Thread(new sendMail("abc@xyz.com"));
    sendEmail.start();
    Thread confirmIt = new Thread(new confirmMailSent());
    sendEmail.start();
    try
    {  
        sendEmail.join();  
    }
    catch(Exception e){}
    confirmIt.start();
}

public class sendMail implements Runnable
{
    String sendTo;
    public sendMail(String sendTo)
    {
        this.sentTo = sendTo;
    }
    public void run()
    {
        //Code to send mail
        wasMailSent=true;
    }
}

public class confirmMailSent implements Runnable
{
    public void run()
    {
        if(wasMailSent)
        {
            feedbackText.setText(null);
            feedbackName.setText(null);
            JOptionPane.showMessageDialog(null, "Mail was sent successfully.", "Mail Sending", JOptionPane.INFORMATION_MESSAGE);
        }
    }
}
public void sendMyMail()
{
    Thread sendEmail = new Thread(new SendMail("abc@xyz.com"));
    sendEmail.start();
}

public class SendMail implements Runnable
{
    String sendTo;

    public SendMail(String sendTo)
    {
       this.sendTo = sendTo;
    }

    @Override
    public void run()
    {
    //Code to send Email
    }
}