在一个网络应用程序中,我有一个方法,如果客户数量小于 10,则等待另一个线程生成报告,但如果大于 10,我会在线程完成时启动线程,但不应用 join 方法我通过电子邮件通知。
我有点担心执行量大的孤立线程以及对服务器的影响。
是否可以在后台(异步)启动一个“繁重”进程而不使用 join 方法,或者有更好的方法来实现它?
try {
thread.start();
if(flagSendEmail > 10){
return "{\"message\":\"success\", \"text\":\"you will be notified by email\"}";
}else{
thread.join(); //the customer waits until finish
}
} catch (InterruptedException e) {
LogError.saveErrorApp(e.getMessage(), e);
return "{\"message\":\"danger\", \"text\":\"can't generate the reports\"}";
}
最佳答案
孤立线程不是问题,只需确保 run()
方法有一个发送电子邮件的finally block 即可。
问题是您无法控制线程数量,这与调用 join()
无关。 (除非您总是等待调用者中的每个线程,否则首先没有必要启动后台线程。)
解决方案是使用 ExecutorService
,它为您提供了一个线程池,从而可以精确控制同时运行的后台线程数量。如果您提交的任务数量超出了执行程序在给定时间可以处理的数量,则剩余的任务将排队等待运行。这样您就可以控制服务器上的负载。
额外的好处是,由于执行程序服务通常会回收相同的工作线程,因此提交新任务的开销较少,这意味着您无需担心是否有超过 10 个项目或不,一切都可以以同样的方式运行。
在您的情况下,您甚至可以考虑使用两个单独的执行器:一个用于运行报告生成,另一个用于发送电子邮件。这样做的原因是您可能希望限制在繁忙时段发送的电子邮件数量,但又不想减慢报告生成速度。
关于java - 安全启动是没有连接的线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31776858/