У меня есть следующий метод:Non функция блокировки, которая сохраняет порядок
void store(SomeObject o) {
}
Идея этого метода заключается в хранении o
для постоянного хранения но функция не должна блокировать. То есть Я не могу/не должен/не должен делать фактическое хранение в том же потоке, который называется store
.
Я также не могу начать поток и сохранить объект из другого потока, потому что store
можно назвать «огромным» количеством раз, и я не хочу начинать нерестовые потоки.
Так что я варианта, которые я не вижу, как они могут хорошо работать:
1) Использование пула потоков (Executor
семьи)
2) В store
сохранить объект в списке массива и возвращении. Когда список массивов достигает, например, 1000 (случайное число), затем запустите другой поток, чтобы «сбросить» список массивов в хранилище. Но у меня все еще была бы проблема с большим количеством потоков (пул потоков?)
Так что в обоих случаях единственным требованием я являюсь то, что я постоянно храню объекты в точно таком же порядке, который был передан store
. И использование нескольких потоков смешивает вещи.
Как это можно решить?
Как я могу гарантировать:
1) неблокирующем store
2) Точный порядок добавления
3) Я не забочусь о каких-либо гарантий хранения. Если, например, что-то сбой, я не забочусь о потере данных, например. кэшированные в списке массивов перед их сохранением.
Почему не 'ConcurrentLinkedQueue'? – Jim
'put' блокирует право? – Jim
'put' блоки в полной очереди. По умолчанию максимальный размер очереди равен 'Integer.MAX_VALUE', поэтому на практике все будет хорошо. Тем не менее, «ConcurrentLinkedQueue» звучит лучше, спасибо за то, что указали! – Vlad