У меня есть этот код, который отлично работает. Этот вопрос сфокусирован на удобстве сопровождения кода и написании меньшего количества кода для достижения той же цели:
Queue<IncomingItem[]> queue = new ConcurrentLinkedQueue<>();
IncomingItem[] EOF = new IncomingItem[0];
ForkJoinPool.commonPool().submit(() -> {
IncomingItem[] next;
while((next = queue.poll()) != EOF) {
if(next == null) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
throw new RuntimeException(e);
}
continue;
}
dao.batchInsert(next);
}
});
ds.reload(queue::add);
queue.add(EOF);
ForkJoinPool.commonPool().awaitQuiescence(1, TimeUnit.HOURS);
Цель состоит в том, чтобы вывод ds.reload
, который является сильно многопоточным методом, передавался в метод dao.batchInsert
, который не является потокобезопасным и не может использоваться совместно с потоками (например, это DAO на основе Hibernate). ), при этом никогда не блокируя метод ds.reload
, как это было бы, если бы метод dao.batchInsert
был сделан synchronized
.
Этот код был совместим с Java 8. Есть ли что-нибудь, что появилось в более новых выпусках Java, которые позволили бы сделать более элегантное решение?