Java 多线程——匹配实例
我想在数据库的两个版本上同时运行两个XPath表达式,这两个版本都返回来自迭代器/Iterable的结果,并将结果节点与列表中的节点匹配 我认为最好的办法是在executorservice的两个线程中运行两个查询,并将两个线程的结果保存在Java 多线程——匹配实例,java,xpath,guava,akka,executorservice,Java,Xpath,Guava,Akka,Executorservice,我想在数据库的两个版本上同时运行两个XPath表达式,这两个版本都返回来自迭代器/Iterable的结果,并将结果节点与列表中的节点匹配 我认为最好的办法是在executorservice的两个线程中运行两个查询,并将两个线程的结果保存在BlockingQueue中,而另一个线程将对BlockingQueue中的结果进行排序,或者将传入的节点或节点键保存在正确的位置 然后,获得结果排序列表和另一个排序列表的交集就很简单了 还有其他建议吗?我还可以自由使用我喜欢的任何技术(最好是Java)。番石榴
BlockingQueue
中,而另一个线程将对BlockingQueue
中的结果进行排序,或者将传入的节点或节点键保存在正确的位置
然后,获得结果排序列表和另一个排序列表的交集就很简单了
还有其他建议吗?我还可以自由使用我喜欢的任何技术(最好是Java)。番石榴在课堂上,但我已经考虑过使用阿克卡的演员
编辑:另一个相关的问题是,以管道方式使用InsertionSort(在收到生成的XPath结果时立即处理它们)或等待整个结果生成并使用QuickSort或MergeSort是否更快。我认为InsertionSort应该更可取,而不管结果元素的数量如何
一般来说,我希望排序和计算两个列表的交集比搜索XPath结果列表中的每个项目的O(n^2)
更快,即使列表除以可用CPU处理器的数量
编辑:
我目前已经实现了第一部分:
final ExecutorService executor = Executors.newFixedThreadPool(2);
final AbsTemporalAxis axis =
new NextRevisionAxis.Builder(mSession).setRevision(mRevision)
.setIncludeSelf(EIncludeSelf.YES).build();
for (final IReadTransaction rtx : axis) {
final ListenableFuture<Void> future =
Futures.makeListenable(executor.submit(new XPathEvaluation(rtx, mQuery)));
future.addListener(new Runnable() {
@Override
public void run() {
try {
mSemaphore.acquire();
} catch (final InterruptedException e) {
LOGWRAPPER.error(e.getMessage(), e);
}
}
}, executor);
}
executor.shutdown();
final ExecutorService sameThreadExecutor = MoreExecutors.sameThreadExecutor();
sameThreadExecutor.submit(new XPathResult());
sameThreadExecutor.shutdown();
return null;
没有任何JavaDoc,但我认为至少它应该可以工作,你认为呢?你有没有更好的解决方案,或者我到目前为止犯过一些错误
亲切的问候,Johannes您确定需要同时执行此操作吗?难道你不能连续地建立两个列表,然后进行排序/交叉吗这将使这个主题的复杂性大大降低 我假设在两个列表都被完全填写之前不能进行交叉,对吗?然后,不需要队列或同步,只需填写两个列表/集合,完成后,处理两个完整列表 但也许我不太明白你的意思
private final class XPathResult implements Callable<Void> {
@Override
public Void call() throws AbsTTException, InterruptedException {
while (true) {
final long key = mQueue.take();
if (key == -1L) {
break;
}
if (mSemaphore.availablePermits() == 0) {
mQueue.put(-1L);
}
// Do InsertionSort.
}
return null;
}
}