gpt4 book ai didi

Java - 并行发送多封邮件

转载 作者:行者123 更新时间:2023-11-30 07:47:36 25 4
gpt4 key购买 nike

我有一个并行发送多封邮件的要求。假设我有 10 个人的电子邮件(我的实际要求有大约 100 个收件人)。为了向所有这10个人发送邮件,我需要点击多个服务来根据emailId收集信息,这会花费很多时间。话虽如此,我的电子邮件触发服务是完全独立的功能,我对邮件触发的顺序没有任何限制。

首先我使用了如下所示的正常方式,但它是按顺序触发并且需要更多时间。

public static void main(String[] args) {

List<String> emails = Lists.newArrayList();
emails.add("first-person@gmail.com");
emails.add("second-person@gmail.com");
emails.add("third-person@gmail.com");
emails.add("fourth-person@gmail.com");
emails.add("fifth-person@gmail.com");
emails.add("sixth-person@gmail.com");
emails.add("seventh-person@gmail.com");
emails.add("eighth-person@gmail.com");
:
:

for(String email: emails) {
sendMail(email);
}
}
private static void sendMail(final String email) {
// function will call many other services for getting the information required for sending the email
try {
Thread.sleep(10000);
System.out.println("Sending Mail for:"+email);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

其次,我听说了 abt Java8 并行流(我对此非常陌生),所以想到如下所示使用它。触发邮件似乎比顺序顺序快一点

public static void main(String[] args) {

List<String> emails = Lists.newArrayList();
emails.add("first-person@gmail.com");
emails.add("second-person@gmail.com");
emails.add("third-person@gmail.com");
emails.add("fourth-person@gmail.com");
emails.add("fifth-person@gmail.com");
emails.add("sixth-person@gmail.com");
emails.add("seventh-person@gmail.com");
emails.add("eighth-person@gmail.com");
:
:

emails.stream().parallel().forEach(email -> {
sendMail(email);
});
}
private static void sendMail(final String email) {
// function will call many other services for getting the information required for sending the email
try {
Thread.sleep(10000);
System.out.println("Sending Mail for:"+email);
} catch (InterruptedException e) {
e.printStackTrace();
}
}

谁能告诉我我使用 Java8 并行流的方法是否适合这种方法

最佳答案

不,不是。您使用它的方式无论如何都会解析为非并发。

你想要的是有一个ExecutorService,你可以将你的邮件发送逻辑传递给它。

ExecutorService mailService = Executors.newFixedThreadPool(threadCount);
for (String email : emails) {
mailService.submit(() -> sendMail(email));
}

编辑:

因为它出现在评论中:您也可以使用几乎相同的构造将它们一一发送,但是:

ExecutorService mailService = Executors.newSingleThreadExecutor();

这将一个一个调用sendMail。在像 emails.forEach(m -> sendMail(m)) 这样的直接循环中执行它的不同之处在于发送本身是在另一个线程中发生的,这意味着主线程不会阻塞调用sendMail 并可以自由地做其他事情。

关于Java - 并行发送多封邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49672140/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com