Java 线程执行受计数和时间限制

我有进程列表,我想像每分钟十个进程一样执行它们。

我试过了ExecutorService,但没有一个能支持我的情况,我也试过了,ThreadPoolExecutor但也许我无法弄清楚如何正确实现它。RateLimiterRxJava


例子

我有Runnable大小为100K的列表,每个Runnable都有这个逻辑:

  • 从 检索数据rest api

  • 对数据进行一些计算。

  • 将结果保存在数据库中。

所以我使用ExecutorService大小10并在内部设置延迟(5 秒)Runnable#run()来管理我需要的“每分钟十个进程”,但仍然无法管理。

这个逻辑的要点是减少对rest api.


更新

实际上,我们正在寻找的是有一个上限(在时间和操作数方面),而不是在各个操作之间平均分配时间,而不管它们各自的吞吐量如何。

即,如果我有一个包含 100 个操作的列表,每个操作需要 0.5 秒,并且我有一个速率限制器,而不是(分发后)确定单个操作应该花费 0.8 秒,那么我可以使用 0.3 秒的间隙来启动一个新的操作


侃侃无极
浏览 351回答 3
3回答

翻翻过去那场雪

我认为使用 a 并以固定速率安排 a 将获得最佳java.util.Timer结果。TimerTask假设您有一个TimerTask在执行时打印出日期的。public class PrintTimeAndIdTask extends TimerTask {&nbsp; &nbsp; private int id;&nbsp; &nbsp; public PrintTimeAndIdTask(int id) {&nbsp; &nbsp; &nbsp; &nbsp; this.id = id;&nbsp; &nbsp; }&nbsp; &nbsp; public void run() {&nbsp; &nbsp; &nbsp; &nbsp; System.out.println(new Date() + " : " + id);&nbsp; &nbsp; }}然后创建一个计时器并安排任务。每个都有不同的延迟,以便它们在您的首选时间间隔内平均分布。public static void main(String[] args) {&nbsp; &nbsp; Timer timer = new Timer();&nbsp; &nbsp; int taskCount = 10;&nbsp; &nbsp; int timeIntervalMs = 60000;&nbsp; &nbsp; int delayBetweenTasks = timeIntervalMs / taskCount;&nbsp; &nbsp; for (int i = 0; i < taskCount; i++) {&nbsp; &nbsp; &nbsp; &nbsp; TimerTask timerTask = new PrintTimeAndIdTask(taskCount);&nbsp; &nbsp; &nbsp; &nbsp; int taskDelay = (long) taskCount * delayBetweenTasks;&nbsp; &nbsp; &nbsp; &nbsp; timer.scheduleAtFixedRate(timerTask, taskDelay, timeIntervalMs);&nbsp; &nbsp; }}您会看到每 6 秒执行一次任务。Wed Feb 20 17:17:37 CET 2019 : 0Wed Feb 20 17:17:43 CET 2019 : 1Wed Feb 20 17:17:49 CET 2019 : 2Wed Feb 20 17:17:55 CET 2019 : 3Wed Feb 20 17:18:01 CET 2019 : 4Wed Feb 20 17:18:07 CET 2019 : 5Wed Feb 20 17:18:13 CET 2019 : 6Wed Feb 20 17:18:19 CET 2019 : 7Wed Feb 20 17:18:25 CET 2019 : 8Wed Feb 20 17:18:31 CET 2019 : 9Wed Feb 20 17:18:37 CET 2019 : 0Wed Feb 20 17:18:43 CET 2019 : 1Wed Feb 20 17:18:49 CET 2019 : 2Wed Feb 20 17:18:55 CET 2019 : 3....请记住,Timer默认情况下 a 不作为守护线程运行。如果您没有在应用程序关闭时明确取消它,它会继续运行,因此您的应用程序将不会关闭。

猛跑小猪

我可能会从延迟队列中提供我的线程池,以将自己限制为每分钟 10 个。有关如何从BlockingQueue.

慕工程0101907

你的意思是这样吗?产生一个线程的单个执行程序,该线程本身产生 10 个线程。private static final int numProcesses = 10;private static final ExecutorService executorService = Executors.newFixedThreadPool(numProcesses);public static void main(String[] args){&nbsp; &nbsp; final ScheduledExecutorService executorService = Executors.newSingleThreadScheduledExecutor();&nbsp; &nbsp; executorService.scheduleAtFixedRate(Test::spawnTenThreads, 0, 5, TimeUnit.SECONDS);}private static void spawnTenThreads(){&nbsp; &nbsp; for (int i = 0; i < numProcesses; ++i)&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp; &nbsp; final int iteration = i;&nbsp; &nbsp; &nbsp; &nbsp; executorService.submit(() -> System.out.println(iteration));&nbsp; &nbsp; }}
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Java