Я использую Fork/Join Framework для выполнения большого количества вычислений параллельно. Я реализовал шаблон производителя и потребителя с помощью простого регистратора для создания консольных выходов, когда программа вычисляет. Производитель и потребитель делят BlockingQueue
, и я использую метод put()
, поэтому я не пропущу обновления.BlockingQueue's put() и высокий уровень параллелизма
Я признал, что производительность при некоторых обстоятельствах ужасна, и VisualVM показал мне, что причиной является метод put()
.
Когда есть проблема ввода новых сообщений в BlockingQueue
моих RecursiveTask
с должны ждать, но ForkJoinPool
продолжает раскошелиться новые задачи, чтобы 2000-5000 задачи пытаются получить доступ к put()
метод, который приводит к очень высоким параллелизмом.
Есть ли подходящий способ справиться с такими ситуациями?
Я думал, что-то вроде
if(!blockingQueue.offer(message) {
blockingQueue.put(message);
}
может быть более производительным при использовании теоретически неограниченное BlockingQueue
.
Так что мой вопрос: есть ли правильный и эффективный способ поместить объекты в BlockingQueue
без потери обновления?
Спасибо заранее!
Несомненно, предложение-то-то-то вроде того, как положить? –
Добавьте достаточно кода, чтобы мы могли видеть проблему. Как именно вы используете F/J? и т. д. – edharned
@ AndyTurner Это? Итак, упомянутый фрагмент не имеет смысла? – r3r57