2014-09-27 1 views
1

우리는 외부 I/O가 필요한 몇 가지 작업을 수행하고 있으며 재귀 적입니다. 이를 위해 이전 ExecutorService에서 ForkJoinPool으로 전환하는 프로토 타입을 작성했습니다. I/O 대기 시간은 스레드의 대부분을 소비하므로 병렬 처리 수준은 코어 수보다 분명합니다. 동기식 네트워크 API 만 있으므로 다른 옵션은 없습니다.Java의 1.7 ForkJoinPool에서 Q 크기 제한

이전 ExecutorService에서는 작업을 거부하여 대기열 크기를 설정하여 작업량을 쌓을 수있었습니다. ForkJoinPool에서는 이것이 가능하지 않지만 Oracle 1.7 구현에서이 값으로 확장 된 것으로 보입니다.

/** 
* Maximum size for submission queue array. Must be a power of two 
* less than or equal to 1 << (31 - width of array entry) to 
* ensure lack of index wraparound, but is capped at a lower 
* value to help users trap runaway computations. 
*/ 
private static final int MAXIMUM_QUEUE_CAPACITY = 1 << 24; // 16M 

이것은 우리가 원하는 상당히 큰 대기열입니다. 다음 기능이있는 포크/조인 풀 구현이 있습니까?

1) 스레드가 생성 될 때 이름을 지정하는 기능을 제공하는 기능은 무엇입니까? 몇 가지 I/O 작업자 풀이 있으며 디버깅을 통해 스레드를 만들고 소유 한 풀을 확인하는 데 유용합니다.

2) 최대 대기열 크기를 설정하는 기능을 제공하십시오. 부모 작업을 예약 할 때 실제로는 0이되기를 원합니다. 스케줄러에 용량이없고 상위 작업이 시작된 경우 제출을 호출하고 예약을 시도하는 스레드에서 실행되기를 원합니다. 이것은 발신자의 속도를 늦추어 자동 스로틀 메커니즘을 제공합니다.

감사합니다, 토드

답변

0
  1. 세 번째 생성자 사용할 수 있습니다

    ForkJoinPool (INT 병렬, ForkJoinPool.ForkJoinWorkerThreadFactory 공장, Thread.UncaughtExceptionHandler 핸들러, 부울 asyncMode)

  2. 없음을 하지만 오픈 소스 소프트웨어에 대한 좋은 점은 당신이 원하는대로 당신 자신의 복사본을 만들고 수정할 수 있다는 것이다. 첫 번째 질문에 대해서는

0

:

당신은

class SimpleThreadFactory implements ThreadFactory { 
    String name; 

    public SimpleThreadFactory (String name){ 
     this.name = name; 
    } 
    public Thread newThread(Runnable r) { 
     return new Thread(r,name); 
    } 
} 

아래로 ThreadFactory을 구현할 수 있습니다 그리고 당신에 대해서 ForkJoinPool 생성자

ForkJoinPool(int parallelism, 
      ForkJoinPool.ForkJoinWorkerThreadFactory factory, 
      Thread.UncaughtExceptionHandler handler, 
      boolean asyncMode) 

이 공장을 통과 할 수 있습니다 초 d 쿼리 :

ForkJoinPool은 작업자 큐 크기를 제어하는 ​​데 유연성을 제공하지 않습니다.