2011-09-22 12 views
1

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을 정렬 할거야? 원하는 해결책이 있습니까? 아니면 지금까지 몇 가지 실수를 저질렀습니까?

종류와 관련,
요하네스

답변

0

당신은 당신이 동시에이 작업을 수행 할 필요가시겠습니까? 당신은 단지 두 개의 목록을 연속적으로 구축 할 수 없으며 그 후에 정렬/교차를 수행 할 수 있습니까? - 해당 주제의 복잡성이 인 이 걸릴 것입니다.

두 목록이 완전히 채워질 때까지 교차 할 수 없다고 가정합니다. 그런 다음 큐 또는 동기화가 필요하지 않으며 두 개의 목록/세트를 채우고 완료되면 두 가지 전체 목록을 처리합니다.

하지만 어쩌면 나는 당신의 요점을 얻고 있지 않을 수도 있습니다 ...