Вот как я понял вопрос и приму вызов:
Оболочка задачи оборачивает задачу или команду и добавляет дополнительные значения, задержку для задачи и идентификатор.Я понял, что две задачи могут иметь один и тот же «ключ», поэтому мы не можем просто взять хеш-значение задач.
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;
}
}
Декоратор очереди добавляет поведение, аналогичное «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 под рукой. Это просто черновик)