gpt4 book ai didi

java - 在现代 Java 中将多线程输出提供给单个线程的惯用方法?

转载 作者:行者123 更新时间:2023-11-30 10:04:58 25 4
gpt4 key购买 nike

我有这段代码可以正常工作。本题侧重于代码的可维护性,写更少的代码来完成同样的目标:

                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 方法,这是非threadsafe non-thread-shareable(例如,它是一个基于 Hibernate 的 DAO),同时从不阻塞 ds.reload 方法,如果使用 dao.batchInsert 方法就会发生这种情况同步

此代码与 Java 8 兼容。较新的 Java 版本中有没有什么可以实现更优雅的解决方案?

最佳答案

在这里使用线程池是一种不必要的复杂化。使用专用线程。不要轮询和 hibernate ,而是使用阻塞队列。

            BlockingQueue<IncomingItem[]> queue = new LinkedBlockingQueue<>();
IncomingItem[] EOF = new IncomingItem[0];
Thread thread = new Thread(() -> {
IncomingItem[] next;
while((next = queue.take()) != EOF) {
dao.batchInsert(next);
}
});
thread.start();
ds.reload(queue::put);
queue.add(EOF);
thread.join();

关于java - 在现代 Java 中将多线程输出提供给单个线程的惯用方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55553534/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com