우리는 외부 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이되기를 원합니다. 스케줄러에 용량이없고 상위 작업이 시작된 경우 제출을 호출하고 예약을 시도하는 스레드에서 실행되기를 원합니다. 이것은 발신자의 속도를 늦추어 자동 스로틀 메커니즘을 제공합니다.
감사합니다, 토드