首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >以线程之间预定义的间隔连续地启动线程。

以线程之间预定义的间隔连续地启动线程。
EN

Software Engineering用户
提问于 2019-11-21 11:32:34
回答 1查看 432关注 0票数 0

我目前正在使用第三方API来获取结果,使用REST客户端(Retrofit)。

问题是每秒对API的请求量受到间隔的限制:请求之间间隔为100 ms时,每秒不能执行10次请求。

由于我希望多线程这些调用的性能目的,我想知道如何管理这个间隔100 ms之间的每个API调用?

我不能在一个线程中睡眠100 ms,因为它被限制在当前线程上。

有办法在多个线程之间使用共享睡眠吗?或者你知道如何实现这一点吗?

谢谢。

EN

回答 1

Software Engineering用户

回答已采纳

发布于 2019-11-21 15:15:11

如果我正确理解,您有多个端点和多个用户并发地发出请求。

然后,您希望确保这些请求至少在全球范围内发生。

这是基本的想法:

可以将要执行的请求添加到队列中。更准确地说,是一个ConcurrentLinkedQueue of Runnable (您将为每个端点创建自定义运行表)。多个线程可以与此单个队列并发交互。

然后,您可以使用一个Timer来执行一个命令,该命令从队列中获取一个项并执行它。这样,每个间隔都会发出请求,而不管它们添加到队列的速率如何(当然,除非它是空的)。

如果需要,将Timer替换为ScheduledThreadPoolExecutor

您可以通过停止Timer (或停止ScheduledFuture)来改进这一点,如果您处于不活动的※时期。另外,在将项添加到队列时(如果停止),再次启动/调度它。

※:跟踪上次请求的时间。如果您从队列中获取了什么,请将时间更新为当前时间。如果你没有,把时间和现在的时间比较一下.如果太多的时间(对太多的定义来说)已经过去了,那么你就处于一段无所事事的时期。

我不知道你是怎么处理回应的。但是,不管它们是否是同步的,它们都是同步的。您可以选择传递一个自定义Consumer,在那里可以传递结果。实际上,您的自定义Runnable (您添加到队列中的那个)可以保存来自客户端的Consumer

票数 2
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/401399

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档