Java ExecutorService,为队列中的所有工作设置总体固定速率

Java ExecutorService,为队列中的所有工作设置总体固定速率,java,asynchronous,concurrency,java.util.concurrent,Java,Asynchronous,Concurrency,Java.util.concurrent,鉴于以下代码: ScheduledExecutorService es = new ScheduledThreadPoolExecutor(100); es.scheduleAtFixedRate(() -> { System.out.println("Do work with a fixed rate! "); }, 0, 1000, TimeUnit.MILLISECONDS); int i = 0; while ( i < 100 ) {

鉴于以下代码:

ScheduledExecutorService es = new ScheduledThreadPoolExecutor(100);

es.scheduleAtFixedRate(() -> {
        System.out.println("Do work with a fixed rate! ");
}, 0, 1000, TimeUnit.MILLISECONDS);


int i = 0;
while ( i < 100 ) {
        es.scheduleAtFixedRate(() -> {
                System.out.println("Do more work with a fixed rate! Doesn't really work! We will end up with 100 'workers', each running with a fixed rate! ");
        }, 0, 1000, TimeUnit.MILLISECONDS);

        i++;
}
ScheduledExecutorService es=新的ScheduledThreadPoolExecutor(100);
es.scheduleAtFixedRate(()->{
System.out.println(“以固定费率工作!”);
},0,1000,时间单位为毫秒);
int i=0;
而(i<100){
es.scheduleAtFixedRate(()->{
System.out.println(“用固定费率做更多的工作!真的不行!我们最终会有100个‘工人’,每个人都以固定费率运行!”);
},0,1000,时间单位为毫秒);
i++;
}
这将创建一个SchedueledThreadPoolExecutor

在while循环中,我们模拟其他人希望向队列添加更多工作,但这显然不起作用

我猜,需要实现某种ThreadPoolExecutor,它使用某种队列,可能是延迟队列

其思想是创建执行器,然后以固定的速率执行任务。如果任务完成得太快,那么已经完成的线程需要等待完成更多的工作

如果一个线程完成得太慢,那么全局时间应该允许线程池中的其他线程完成更多的工作

但我希望这已经完成了,因为这应该是一个相当普遍的问题


有人有好的解决办法吗

你想做什么还不完全清楚,但我猜你需要一种能够确保任务以一定速度执行的速度(想想办公楼和其他建筑入口处的旋转门,门的速度决定了可以进入(或离开)的人数)每个时间单位的建筑物以及每个入口(或出口)之间的时间差)


ScheduledExecutorService不是解决该问题的方法。取而代之的是,从研究这个问题开始

A
ScheduledThreadPoolExecutor
维护一个任务队列,该队列由任务的下一次计划执行排序。这些任务(您提供的
Runnable
实例)完全独立于将执行它们的线程。换句话说,线程不只是获取一个任务,执行它,然后进入睡眠状态等待该任务的下一次执行

相反,线程轮询队列,获取任务,执行任务,通过将任务重新插入队列来计划任务的下一次执行,然后再次轮询队列。如果队列中有任务,那就太好了。如果没有,则等待下一个任务准备就绪(无论它当前在队列中还是稍后添加)。然后他们重新启动整个过程


综上所述,一个具有100个线程的
ScheduledThreadPoolExecutor
可以轻松地以任何类型的速率处理100多个任务

我很困惑。作为计划池,它将计划任务在将来运行。在那之前它不会阻塞每个线程。线程仍然可以自由执行之前计划的其他任务。@SotiriosDelimanolis-Hmm,它还可以用于以固定速率运行任务。我想,我想要的是能够创建一个线程池,该线程池最初以固定速率运行,然后能够在稍后向其队列添加工作,使其继续以固定速率运行。使用Schedueled,我相信您可以以固定的速率运行一次,但随后添加更多的工作,我不确定。pool.execute将只执行它,因为对整个线程池没有全局时间限制。你知道吗?也许需要使用某种延迟队列,但我还没有找到任何好的例子。我仍然感到困惑。你什么时候把工作排成队都没关系。它将根据您使用的速率运行(ymmv基于线程数和您正在做的工作)。