2011-06-27 10 views
2

私はウェブクローラーをやっています。要求にサーバーをオーバーロードしないために、サーバーへのアクセスを時間制限します。Javaでは、時間の経過後に要素を取ることができるコレクションがありますか?

私は訪問するリンクのリストであるオブジェクト/コレクションを持っています。

私は最初のリンクを取得しており、Google(例)から来て、すべての作業を行います。私は20秒後にGoogleからの別のリンクを取ることができます(例)と私は待っている間に、私は他のドメインからのリンクを取得します。

要約すると、私はその中のオブジェクトを分類し、それからオブジェクトを決められた間隔で取得できるコレクションが必要です。

これにはいくつかの類似点がありますか?そうでない場合、実装で使用するコレクションはどのようなものが推奨されますか?このコレクションは、さまざまなスレッドによってアクセスされます。

+0

スマートマップ/リダクションジョブのための完全な例です。 – fyr

答えて

7

これにはDelayQueueを使用できます。 「期限切れ」になってからアイテムを取り出すことを許可するコンカレントコレクションです。追加する項目には、Delayedを実装する必要があります。

また、ScheduledExecutorServiceを使用することもできます。たとえば、クロールしていた各ドメインについて、次のリンクを取得するタスクをスケジュールし、次のリンクで別のタスクを再スケジュールすることができます。

+0

ニート!私はそのクラスを知らなかった。私は、リンクが単純なキューにあり、訪問したときにそのドメインのエントリが別のハッシュテーブルで新しいタイムスタンプで更新されたアプローチを提案しようとしていました。 DelayQueueの全体的な効果は同じですが、はるかにエレガントです。 +1サー。 – jpm

+0

+1 right on spot – maasg

+0

@jpmあなたが提供するのと同じソリューションを試してみましたが、私はDelayQueueを試します。私はそれも知らなかった。 –

関連する問題