Какой тип очереди блокировки следует использовать? - PullRequest
2 голосов
/ 14 декабря 2011

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

Например, рассмотрим очередь из x элементов, в которые были добавлены элементы 1,4,8,10. Таким образом, 10 может быть доступно, но до 9 не добавлено и не доступно, 8 не может быть. Короче говоря, все элементы взаимосвязаны.

Пожалуйста, дайте мне знать, если в java уже реализован такой тип коллекции. Так что я могу использовать его напрямую.

Ответы [ 2 ]

1 голос
/ 14 декабря 2011

Вы говорите о стеке или очереди, в зависимости от того, хотите ли вы, чтобы они были FIFO или LIFO , в сочетании со вставкой элементов в числовом порядке в первомместо - это означает, что вы сортируете элементы при вставке, чтобы они всегда были в правильном числовом порядке.

При сортировке элементов по числовому порядку при сортировке гарантируется, что они будут в том порядке, который вы ожидаете, когдаВы удаляете их.

Вы можете использовать Java LinkedList для того, чтобы вставлять элементы туда, где вы хотите, чтобы они были в списке, а также удалять их из формы «назад» или «спереди» списка, если необходимо.

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

Также проверьте этот вопрос: СозданиеОчередь блокировки в .NET? - это не Java, но она очень похожа и может дать некоторое представление.

0 голосов
/ 14 декабря 2011

Завершение очереди с логикой, которая помещает элементы в нее по порядку. Например. создать класс, который реализует Queue и BlockingQueue. Большинство методов (например, get) делегируют напрямую что-то вроде внутреннего ArrayBlockingQueue, но «put» помещает вещи во внутренний ArrayBlockingQueue по порядку. Если put вызывается с элементом, который еще не должен быть доступен, вы сохраняете его в другой промежуточной структуре данных.

Каждый раз, когда метод put вызывается с элементом «next up», вы помещаете его в очередь, а затем просматриваете промежуточную структуру данных и добавляете в очередь любые элементы, которые теперь могут быть добавлены.

...