これが私が質問を理解し、挑戦する方法です:
タスクラッパーは、タスクまたはコマンドをラップし、追加の値、タスクの遅延、および識別子を追加します。2つのタスクが同じ「キー」を持っている可能性があることを理解したので、タスクのハッシュ値だけを取得することはできません。
public TaskWrapper<T> {
private T task;
private long delayInMillis;
private long key;
public TaskWrapper(T task, long delayInMillis, long key) {
this.task = task;
this.delayInMillis = delayInMillis;
this.key = key;
}
// getter, setters, and so on
public boolean equals(Object o) {
if (o == null || !(o instanceof TaskWrapper)) return false;
return key == ((TaskWrapper) o).key;
}
}
キューデコレータは、動作のような「セット」を追加します。キューには「contains」メソッドがないため、実際にエンキューされたオブジェクトを記録するために追加のSetを使用します。キューを変更するすべてのメソッドは、内部キューとセットの間の一貫性を維持するために実装されます。このクイックドラフトはスレッドセーフではなく、add
メソッドのみを示しています。
public SetQueue<TaskWrapper> implements Queue<T> {
private Queue<TaskWrapper> queue;
private Set<TaskWrapper> set = new HashSet<TaskWrapper>();
public SetQueue(Queue<TaskWrapper> queue) {
this.queue = queue;
}
// just to demonstrate the idea
public boolean add(TaskWrapper<?> task) {
if (set.contains(task)
return false;
boolean result = queue.add(task);
if (result)
set.add(task);
return result;
}
(バグでいっぱいかもしれません、私は手元にIDEを持っていません。それは単なるドラフトです)