【问题标题】:In Java, there is a collection which I can take an element only after a time?在Java中,有一个集合,我只能在一段时间后获取一个元素?
【发布时间】:2011-06-27 19:54:21
【问题描述】:

我正在做一个网络爬虫,我不想让服务器的请求超载,所以我会按时间限制对服务器的访问。

我将拥有一个对象/集合,它是我将访问的链接列表。

我获得了第一个链接,它来自 Google(示例),请访问并完成所有工作。我只能在 20 秒后获取另一个来自 Google 的链接(示例),在等待期间,我会获取来自其他域的链接。

总之,我需要一个集合,让我可以对其中的对象进行分类,并以确定的间隔从中获取对象。

还有一些类似的吗?如果不是,建议在实现中使用哪些集合?这个集合将被各种线程访问。

【问题讨论】:

  • 这是智能地图/减少作业的完美示例。

标签: java collections thread-safety web-crawler timedelay


【解决方案1】:

您可以为此使用DelayQueue。这是一个并发集合,仅允许在“过期”后从中取出项目。您添加的项目必须实现Delayed

您可能还只想使用ScheduledExecutorService。例如,对于您正在抓取的每个域,您可以安排一个抓取下一个链接的任务,然后使用下一个链接重新安排另一个任务。

【讨论】:

  • 整洁!我不知道这些课程。我正要建议一种方法,其中链接位于一个简单的队列中,当一个被访问时,该域的条目会在单独的哈希表中使用新的时间戳进行更新。与 DelayQueue 的整体效果相同,但远没有那么优雅。 +1 先生。
  • @jpm 我打算尝试您提供的相同解决方案,但我会尝试延迟队列。我也没有意识到。
  • 工作。我正在使用一个队列,其中每个域划分的链接实现了延迟接口,在另一个类中,一个延迟队列,其中包含所有链接队列。
猜你喜欢
  • 2012-01-11
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 2021-01-14
  • 1970-01-01
  • 2021-12-08
  • 2013-05-28
  • 1970-01-01
相关资源
最近更新 更多