Java 多线程——匹配实例

Java 多线程——匹配实例,java,xpath,guava,akka,executorservice,Java,Xpath,Guava,Akka,Executorservice,我想在数据库的两个版本上同时运行两个XPath表达式,这两个版本都返回来自迭代器/Iterable的结果,并将结果节点与列表中的节点匹配 我认为最好的办法是在executorservice的两个线程中运行两个查询,并将两个线程的结果保存在BlockingQueue中,而另一个线程将对BlockingQueue中的结果进行排序,或者将传入的节点或节点键保存在正确的位置 然后,获得结果排序列表和另一个排序列表的交集就很简单了 还有其他建议吗?我还可以自由使用我喜欢的任何技术(最好是Java)。番石榴

我想在数据库的两个版本上同时运行两个XPath表达式,这两个版本都返回来自迭代器/Iterable的结果,并将结果节点与列表中的节点匹配

我认为最好的办法是在executorservice的两个线程中运行两个查询,并将两个线程的结果保存在
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;
    }
}