Iterator/Iterable의 결과를 반환하고 결과 노드를 List의 노드와 일치시키는 두 개의 데이터베이스 버전에서 두 개의 XPath- 표현식을 동시에 실행하려고합니다. 다중 스레딩 - 일치 인스턴스
나는 가장 좋은 것은 다른 스레드가BlockingQueue
의 결과를 정렬하는 것입니다 반면, ExecutorService를에서 두 개의 스레드에서 두 쿼리를 실행하고
BlockingQueue
모두 스레드의 결과를 저장하거나 실제로 수신 노드 나 nodeKeys을 절약 할 생각 올바른 위치에.
그런 다음 결과로 정렬 된 List와 다른 정렬 된 List의 교차점을 얻는 것은 간단합니다.
다른 제안 사항이 있으십니까? 나는 또한 내가 좋아하는 기술 (자바가 선호)을 자유롭게 사용할 수있다. Guava는 클래스 패스에 있지만 Akka의 액터 사용에 대해서는 이미 생각했습니다.
편집 : 파이프 라인 방식으로 InsertionSort를 사용하면 (생성 된 XPath 결과를받을 때 처리하는 것이 더 빠름) 전체 결과가 생성 될 때까지 기다렸다가 QuickSort 또는 MergeSort . 결과적으로 요소 수에 관계없이 InsertionSort가 바람직하다고 생각합니다.
일반적으로 목록을 수있는 CPU 프로세서 수로 나눈 경우에도 정렬 및 두 목록의 교차 계산이 XPath 결과 목록의 각 항목 검색에 대해 O(n^2)
보다 빠릅니다.
편집 :
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;
세마포어 2로 초기화되고 XPathEvaluation
에 결과 nodeKeys가 LinkedBlockingQueue
에 추가됩니다 나는 현재 첫 번째 부분을 구현했습니다. 어떤의 JavaDoc없이
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;
}
}
을,하지만 난 적어도 작동합니다, 당신은 어떻게 생각하십니까 생각 : 다음
나는 아직 구현되지 않은 코멘트와 함께 표시된 XPathResults을 정렬 할거야? 원하는 해결책이 있습니까? 아니면 지금까지 몇 가지 실수를 저질렀습니까?
종류와 관련,
요하네스