LinkedBlockingQueue поставил предложение vs
У меня есть связанная блокирующая очередь, в которой я выполняю операции вставки и удаления.
Мне нужно знать, какой из них лучше put
или offer
в случае связанной блокировки очереди.
Параметры производительности - загрузка процессора, память и общая пропускная способность.
Использование приложения - система реального времени, где может быть несколько входящих запросов и меньше потоков для обработки, где нам нужно будет вставить элемент в очередь.
Я прочитал Java-документы о поставке и предложил, что во внутреннем приложении не было большой разницы.
Ответы
Ответ 1
На самом деле, вы не можете сравнить производительность между этими двумя, метод offer
- просто предложить очередь, и он не ждет или ждет указанного времени, но метод put
ждет бесконечно долго, пока не будет доступно пространство, поэтому их использование другой.
Используйте put
где вы не можете позволить себе потерять предмет, имея в виду, что он будет удерживать ваш стек вызовов, иначе используйте offer
.
Ответ 2
LinkedBlockingQueue полностью реентерабелен, и метод poll() не блокирует put(). Однако метод poll() будет вращаться. Вероятно, вы должны использовать queue.take(), который ожидает, что там будет элемент в очереди, вместо того, чтобы возвращать null, если очередь пуста.
Также рассмотрите этот сценарий, метод poll (long, TimeUnit) будет ожидать добавления элемента в очередь за период времени и возвращает null, если таймер истекает. Это более чистое ожидание ждать чего-то в очереди.
// wait for 2000ms for there to be an object in the queue
Object o = queue.poll(2000, TimeUnit.MILLISECONDS);
// no sleep necessary
return o;
Ответ 3
В документации дается ответ на этот вопрос. Предложение не ждет и "сдастся", если очередь достигнет емкости. Тем не менее, put будет ждать, пока место станет доступным - другими словами, он будет блокироваться до тех пор, пока не будет доступно пространство. Поэтому предложение явно быстрее, так как оно никогда не блокируется.