Нужна смесь задержки и карты - PullRequest
2 голосов
/ 16 августа 2010

У меня есть приложение без кнопки сохранения;сохранение происходит автоматически в фоновом режиме.Поскольку пользователь работает с приложением, задачи создаются и помещаются в очередь для выполнения.Некоторые из них откладываются, например, когда вы начинаете печатать, я жду 200 мс, прежде чем обновлять соответствующее значение в базе данных.

Чтобы сделать использование кода более простым, я бы хотел иметь возможностьдобавить задачу в очередь с задержкой и «ключом».Если уже существует задача с тем же «ключом», то мою вторую задачу следует игнорировать (поскольку эта же операция уже поставлена ​​в очередь).

Уже существует что-то подобное?

Ответы [ 3 ]

3 голосов
/ 16 августа 2010

Я думаю, вы должны изучить класс TreeMap . Используйте конструктор, который позволит вам передать компаратор. Таким образом, вы можете позволить Map сортировать по Delayed (поскольку этот класс реализует интерфейс Comparable). Перед добавлением «Задачи» на карту проверьте, существует ли ключ, используя метод containsKey.

1 голос
/ 16 августа 2010

Вот как я понял вопрос и приму вызов:

Оболочка задачи оборачивает задачу или команду и добавляет дополнительные значения, задержку для задачи и идентификатор.Я понял, что две задачи могут иметь один и тот же «ключ», поэтому мы не можем просто взять хеш-значение задач.

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 под рукой. Это просто черновик)

0 голосов
/ 20 августа 2010

Одно из элегантных решений, которое пришло мне в голову: использовать исполнитель пула потоков, который имеет приоритетную очередь блокировки в качестве рабочей очереди.

...