1

我有一个客户端应用程序,其中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秒之间。

+0

您能详细描述一下计划任务的特点吗? CPU或I/O绑定?共同资源?平均执行时间? – laune

+0

那么有多少Rserve服务器?这看起来像一个资源给我,你可能会争论。并行比Rserve服务器多的线程是没有意义的。 - 另外我现在在我的头盔上有什么“全速”的意思,但是每分钟有多少请求是在你的速度计上?以固定速率进行调度不是处理许多任务的最佳答案,它可能会避免同步问题。我不想苛刻,但是你有没有彻底检查过你的设计? – laune

+0

消息的处理不与任务耦合,该任务应该以固定速率运行。这个想法是使用固定费率任务来批量处理传入消息流。因此收集消息的相关信息并以固定的速率处理。否则,尽管要使用批处理。 – 7morgen

回答

0

你有多少个线程在运行,你有多少个核心?是否会发生这样的情况:您为来自不同线程的每个请求提供服务,并且上下文切换会使您的应用程序运行得越来越慢?

注意不要有比核心更多的CPU绑定线程。 (只是一个猜测,对不起,如果它的方式关闭)

另外,你需要一个计划的线程池执行器智慧核心大小为10? SingleThreadScheduledExecutor是否足够用于计划任务?

+0

问题不是答案!将此移至评论。 – laune

+0

我很乐意做到这一点,但当我最后一次尝试50声望是评论问题的最低限度;-) – TamasGyorfi

+0

小心:这样的答案通常是downvoted,这将减少你的代表甚至更多。 - 通常的建议是耐心并收集积分,直到您可以发表评论。 – laune