java.util.concurrent.ScheduledExecutorService运行频率非常低

java.util.concurrent.ScheduledExecutorService运行频率非常低,java,scheduled-tasks,runnable,java.util.concurrent,scheduledexecutorservice,Java,Scheduled Tasks,Runnable,Java.util.concurrent,Scheduledexecutorservice,我有一个客户端应用程序,其中runnable必须在固定时间内运行。因此,我使用java.util.concurrent.ScheduledExecutorService如下: ScheduledExecutorService scheduledExecutorService = Executors.newScheduledThreadPool(10); ScheduledFuture scheduledFuture = scheduledExec

我有一个客户端应用程序,其中runnable必须在固定时间内运行。因此,我使用
java.util.concurrent.ScheduledExecutorService
如下:

ScheduledExecutorService scheduledExecutorService =
            Executors.newScheduledThreadPool(10);

ScheduledFuture scheduledFuture =
            scheduledExecutorService.scheduleAtFixedRate(runnableClass,
            period,period,TimeUnit.SECONDS);
只要工作负载较低,任务就安排在定义的时间段内,即如果客户机没有收到来自服务器的消息。但是如果服务器全速发送消息,则
runnableClass.run()
不会按时执行。我觉得两次执行之间的时间呈指数级增长。但计算机仍然运行平稳

所有
异常
都在
run()
中捕获,如果我减少从服务器发送的消息,任务的调度频率会更高

为什么会这样

编辑:任务需要大量资源,它正在使用
Rserve
获得在
R
中计算的预测。一个任务中可能有多达5000个调用
R


我做了一些关于任务时间的测试。任务总是在不到一秒的时间内完成,而时间段在3到20秒之间。

您正在运行多少线程以及有多少内核?你会不会为来自不同线程的每个请求提供服务,而上下文切换会让你的应用运行得越来越慢

注意不要有比内核更多的CPU绑定线程。 (只是一个猜测,如果太离谱了,很抱歉)


另外,您是否需要一个内核大小为10的调度线程池执行器?单线程ScheduledExecutor是否足以执行计划的任务?

您正在运行多少线程以及有多少内核?你会不会为来自不同线程的每个请求提供服务,而上下文切换会让你的应用运行得越来越慢

注意不要有比内核更多的CPU绑定线程。 (只是一个猜测,如果太离谱了,很抱歉)


另外,您是否需要一个内核大小为10的调度线程池执行器?SingleThreadScheduledExecutor不足以执行计划任务吗?

能否详细描述计划任务的特征?CPU还是I/O绑定?共同资源?平均执行时间?那么有多少个Rserve服务器?在我看来,这是一个资源,您可能有争议。拥有比现有的Rserve服务器更多的并行线程是没有意义的。-还有,我现在知道“油门全开”对我的老爷车意味着什么,但你的速度表上每分钟有多少个请求?以固定速率调度并不是处理许多任务的最佳答案,它可以避免同步问题。我不想说得太苛刻,但是您的设计已经过彻底的审查了吗?消息的处理与任务没有耦合,任务应该以固定的速率运行。其思想是使用固定速率任务批处理传入消息流。因此,应收集信息的相关信息,并以固定速率进行处理。否则,使用批处理是非常困难的。只有一台Rserve服务器。服务器(用于测试,不是我写的)发送消息,直到客户端有2000个线程打开,然后等待100毫秒。Re“否则…很难使用批处理”:通常,要由某个实体处理的消息被放入队列,该队列将处理器的输入序列化。收集它们并向处理器扔一个包不是普遍认可的解决方案。-但是你现在已经失去了我-我对整个场景感到困惑-哪个实体以何种频率向哪个处理器发送消息?你能详细描述计划任务的特征吗?CPU还是I/O绑定?共同资源?平均执行时间?那么有多少个Rserve服务器?在我看来,这是一个资源,您可能有争议。拥有比现有的Rserve服务器更多的并行线程是没有意义的。-还有,我现在知道“油门全开”对我的老爷车意味着什么,但你的速度表上每分钟有多少个请求?以固定速率调度并不是处理许多任务的最佳答案,它可以避免同步问题。我不想说得太苛刻,但是您的设计已经过彻底的审查了吗?消息的处理与任务没有耦合,任务应该以固定的速率运行。其思想是使用固定速率任务批处理传入消息流。因此,应收集信息的相关信息,并以固定速率进行处理。否则,使用批处理是非常困难的。只有一台Rserve服务器。服务器(用于测试,不是我写的)发送消息,直到客户端有2000个线程打开,然后等待100毫秒。Re“否则…很难使用批处理”:通常,要由某个实体处理的消息被放入队列,该队列将处理器的输入序列化。收集它们并向处理器扔一个包不是普遍认可的解决方案。-但是你现在已经失去了我-我对整个场景感到困惑-哪个实体以何种频率向哪个处理器发送消息?问题不是答案!将此移到评论。我很乐意这样做,但当我上次尝试评论一个问题时,50个声誉是最低限度的;-)注意:这样的答案通常会被否决,这会进一步降低你的代表性。-通常的建议是耐心地收集分数,直到你发表评论。问题不是答案!将此移到评论。我很乐意这样做,但当我上次尝试评论一个问题时,50个声誉是最低限度的;-)注意:这样的答案通常会被否决,这会进一步降低你的代表性。-通常的建议是耐心地收集分数,直到你可以发表评论。