Существует BlockingQueue (в частности ArrayBlockingQueue), доступ к которому осуществляется с тем же числом потоков offer
и poll
в / из этого (5 потоков предлагают и 5 других потоков опрашивают).
BlockingQueue myQueue = new ArrayBlockingQueue<>(1000);
Проблема в том, что если, скажем, частота offer
равна 1 мс, частота poll
будет примерно равна 1500 мс (из-за времени обработки, потребляемого каждым опрашиваемым объектом, в каждом интервале l oop) , В этой ситуации очередь заполняется, что приводит к сбою новых команд offer
и отбрасыванию объектов.
while (true) {
Object obj = myQueue.poll();
if (obj != null) {
// Process the object, takes ~ 1500 ms
}
}
Каков наилучший подход (ориентированный на производительность), чтобы заставить это работать?
Должен ли я увеличить число poll
входящих потоков на x1500?
Возможно, решение проблемы - увеличение размера ArrayBlockingQueue или даже замена его на ConcurrentLinkedQueue?
Или просто увеличение TimeOut в offer(TimeOut, TimeUnit)
метод в offer
темы может решить эту проблему?
Или лучше? ....
Важно отметить, что входящие offer
ed объекты невозможно остановить, поэтому объекты не должны накапливаться в очереди. В заключение, Скорость и Производительность крайне важны для предотвращения свертывания в этом потоке данных.
Спасибо