3

だから今、私はカレンダーオブジェクトを格納するハッシュマップを持っています(日付を格納する方法が必要です)。各値には 2 つの Calendar オブジェクトが格納され、1 つはイベントの開始を表し、もう 1 つはイベントの終了を表します。ユーザーは GUI を介してこれらを入力し、数週間から数か月にまたがることができます。

私がする必要があるのは、有効期限が切れたときにこれらのエントリを削除できるようにすることです。つまり、実際の日付に従って 2 番目の Calendar オブジェクトが経過したことを意味します。インスタンスが実行されている限り、これを自動的に実行したいと考えています。

私のアイデアは、タイマー スレッドを実行し、週に 1 回、ハッシュマップ内のすべてのエントリを調べて、有効期限が切れたエントリを削除することでした。それほど実用的ではないことはわかっています。学校のプロジェクト用です。しかし、これを効率的に実装するのに役立つアイデアやデザインパターンを探していました。

ありがとうございます。さらに情報が必要な場合はお知らせください。

4

5 に答える 5

1

たぶんこれは次の場合に役立ちます: http : //code.google.com/p/guava-libraries/wiki/CachesExplained Guavaには「キャッシング」メカニズムがあり、タイムアウトを処理します...

したがって、処理はあなたのために行われますが、注意してください。バックグラウンドで実行されているスレッドはありません。メンテナンスは、ワートの間に行われます。情報もリンクに含まれています。

guava-solutionは別の方法で「説明」します。アクセス中にタイムアウトしたこと、または自動的にシャットダウンしたことを通知するタイムアウト要素のリスト/マップを処理してみませんか。要素を外部から管理する必要はありません。要素は独自にタイムアウトを処理できます。この方法は、多くの場合、非常に単純で、ユーザーに対して透過的です。

于 2012-10-24T04:15:18.330 に答える
1

使用Calendarすることは悲しみにつながるだけです-それは落とし穴とバグが満載のひどいクラスです.

代わりに、開始と終了をlong値として保存し、Date.getTime()これらを と比較してSystem.currentTimeMillis()、物事をクリーンでシンプルに保ちます。

于 2012-10-24T01:42:07.720 に答える
1

メンテナンス タスクを実行するバックグラウンド スレッドを持つことは良い考えであり、非常に一般的な方法です。ただし、Hashmap はスレッド セーフではないため、アクセスを同期するか、ConcurrentHashMap などのスレッド セーフなクラスに置き換える必要があることに注意してください。

于 2012-10-24T01:35:54.943 に答える
0

TimerTaskもう 1 つのオプションは、 for every エントリをインスタンス化することです。run()時間にマップからエントリを削除するメソッドを実装schedule()します。これはおそらく終了時間です。そうすれば、毎週のクリーンアップは必要なく、エントリは有効期限が切れるとすぐに削除されます。

そしてもちろん、おそらくスレッドセーフなバリアント、つまりMap実装を使用して、スレッドセーフに注意してください。

【編集済】

またはScheduledThreadPoolExecutor、代わりに , を使用することをお勧めします。

于 2012-10-24T02:59:53.283 に答える
0

代わりに TreeSet を作成できます

TreeSet<DateObject> yourTreeSet = new TreeSet<DateObject>(new DateComparator());

次に、コンパレータを実装すると、TreeSet にオブジェクトを追加すると、オブジェクトがソートされます。

于 2012-10-24T01:37:02.047 に答える