Java 从背景线程更均匀地分布负载

Java 从背景线程更均匀地分布负载,java,multithreading,scheduledexecutorservice,Java,Multithreading,Scheduledexecutorservice,我有一个背景线程,每5分钟运行一次。我正在为此使用ScheduledExecutorService。每五分钟,我就给我的一个服务打一个电话,并解析该服务返回的响应 public class ThreadScheduler { private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1); public void startScheduleTask() {

我有一个背景线程,每5分钟运行一次。我正在为此使用
ScheduledExecutorService
。每五分钟,我就给我的一个服务打一个电话,并解析该服务返回的响应

public class ThreadScheduler {

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public void startScheduleTask() {

        scheduler.scheduleAtFixedRate(new Runnable() {
            public void run() {
                try {
                    callService();
                } catch (Exception ex) {
                    // log error
                }
            }
        }, 0, 5L, TimeUnit.MINUTES);
    }

    public void callService() throws Exception {
        // execute the service and parse the response
    }   
}
现在上面的代码在1000台机器上运行,它们都是同时启动的,这意味着它将每5分钟同时对我的服务进行所有1000次调用。我正试图在5分钟的时间内更均匀地分散负载。使用上述代码有可能做到这一点吗

我只是想在5分钟的时间内将负载更均匀地分布在我的服务上,这样它就不会同时影响我的服务,一旦所有系统同时启动,这将增加负载

我想出了以下代码,试图在五分钟的时间内更均匀地分配负载:

public class ThreadScheduler {

private final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

    public void startScheduleTask() {

        scheduler.scheduleAtFixedRate(new Runnable() {
            public void run() {
                try {
                    callService();
                } catch (Exception ex) {
                    // log error
                }
            }
        }, (int)(Math.random()*5*60), 5*60L, TimeUnit.SECONDS);
    }

    public void callService() throws Exception {
        // execute the service and parse the response
    }   
}

这是否是在5分钟内均匀分配负荷的正确方法。

这会有所帮助,但在第一次变化后,日程安排仍然是固定的。另一种更分散负载的方法是在每次执行中使用并放置一个短的、随机的暂停(例如,
Thread.sleep(Math.random()*5000L)
就在
callService()
之前)。随着时间的推移,这将导致更多的变化


此外,为了测试可变性,您可以创建一个简单的测试程序来打印当前时间(以毫秒为单位),而不是调用实际的服务。使用不同的算法运行测试程序一小时,并将结果绘制成图表。选择能为您提供最佳传播效果的版本。

谢谢您的建议。你能给我举一个“固定延迟时间表”的例子让我更好地理解吗?我不确定我是否理解正确。