这是我的代码:
public String addxyz ()
{
String returnStatus = "";
DBConnection conn = new DBConnection();
returnStatus = conn.fun_GetData();
ArrayList<String> emailList = new ArrayList<String>();
emailList.add("xyz@gmail.com");
emailList.add("asd@hotmail.com");
for(String email : emailList)
{
SendEmail sendEmail = new SendEmail();
boolean statusEmail = sendEmail.SendingEmail(email);
}
return returnStatus;
}
我想知道在返回方法状态后,向每个电子邮件地址发送电子邮件的最佳方式是什么。
例如,我有100个电子邮件列表,因此上述方法首先发送100封电子邮件,然后返回状态。
但是我想返回一些内容然后发送电子邮件,这样可能吗?
答案 0 :(得分:0)
您必须异步发送电子邮件。
您可以很好地修改多线程程序,其中您在不同的执行程序线程中发送电子邮件,主线程返回状态而不会在发送电子邮件时被阻止。
您可以使用Java Executors api。
答案 1 :(得分:0)
对于多线程,你可以这样做:
public String addxyz (String qweqw)
{
String returnStatus = "status";
ArrayList<String> emailList = new ArrayList<String>();
emailList.add("xyz@gmail.com");
emailList.add("asd@hotmail.com");
for(String email : emailList)
{
// create a thread
Thread th = new Thread(){
@Override
public void run(){
// Your SendMail logic
SendEmail sendEmail = new SendEmail();
boolean statusEmail = sendEmail.SendingEmail(email);
}
};
th.start(); // start the thread & continue to next email
}
return returnStatus;
}
答案 2 :(得分:0)
从你问题的片段中,状态和参数似乎完全没用。所以你可以这样做:
// in main execution path
String returnStatus = "status";
new Thread( new Runnable() {
@Override public void run(){ addxyz("dummy"); }
} ).start();
但我真的怀疑这会成功。我想你的例子错过了在函数中可以改变状态的地点和原因。那么这个解决方案是无效的!
从你的状态在函数内部发生变化的角度来看,你可以将其余部分包装在一个Thread / Runnable中并运行它。例如:
....
returnStatus = conn.fun_GetData();
new Thread( new Runnable() { @Override public void run() {
ArrayList<String> emailList = new ArrayList<String>();
emailList.add("xyz@gmail.com");
emailList.add("asd@hotmail.com");
for(String email : emailList)
{
SendEmail sendEmail = new SendEmail();
boolean statusEmail = sendEmail.SendingEmail(email);
}
}}).start();
return returnStatus;
在Java 8中,您还可以使用Lambda:
new Thread( () -> {
// your code here
} ).start();