我有一个客户端应用程序,其中runnable必须在修复期运行。因此,我使用java.util.concurrent.ScheduledExecutorService
如下:java.util.concurrent.ScheduledExecutorService运行非常不频繁
ScheduledExecutorService scheduledExecutorService =
Executors.newScheduledThreadPool(10);
ScheduledFuture scheduledFuture =
scheduledExecutorService.scheduleAtFixedRate(runnableClass,
period,period,TimeUnit.SECONDS);
只要工作量为低时,任务被调度在定义的时间段,即,如果客户端从服务器接收任何消息。但是,如果服务器以全速度拍摄消息,则不会按时执行runnableClass.run()
。我觉得执行之间的时间呈指数级增长。但电脑仍然运行平稳。
所有Exceptions
都在run()
之内,如果我减少了从服务器发送的消息,则会更频繁地调度该任务。
为什么会发生这种情况?
编辑:任务需要大量的资源,它使用Rserve
获得在R
计算出的预测。在一项任务中,可能多达5000个呼叫R
。
我做了一些关于任务时间的测试。任务总是在一秒之内完成,而时间在3到20秒之间。
您能详细描述一下计划任务的特点吗? CPU或I/O绑定?共同资源?平均执行时间? – laune
那么有多少Rserve服务器?这看起来像一个资源给我,你可能会争论。并行比Rserve服务器多的线程是没有意义的。 - 另外我现在在我的头盔上有什么“全速”的意思,但是每分钟有多少请求是在你的速度计上?以固定速率进行调度不是处理许多任务的最佳答案,它可能会避免同步问题。我不想苛刻,但是你有没有彻底检查过你的设计? – laune
消息的处理不与任务耦合,该任务应该以固定速率运行。这个想法是使用固定费率任务来批量处理传入消息流。因此收集消息的相关信息并以固定的速率处理。否则,尽管要使用批处理。 – 7morgen