java - 安全启动是没有连接的线程吗?

标签 java multithreading asynchronous

在一个网络应用程序中,我有一个方法,如果客户数量小于 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/

相关文章:

objective-c - 等待异步函数完成

java - idsIterator.remove() 抛出 IllegalStateException

java - 数组和文本文件的对象

java - 并发合并队列和监听器

asynchronous - 异步模式下的 Log4j2 在重负载下仍然阻塞在 java.util.concurrent.lock 上

Objective-c 异步内存管理

java - 单击按钮时如何显示颜色选择器?

java - DB2 BIGINT id 生成器

java - 在测试中杀死一个java线程

c# - 如何并行运行一组函数并等待完成后的结果?