Java Language
포크 / 결합 프레임 워크를 사용한 병렬 프로그래밍
수색…
Java 포크 / 가입 작업
Java의 fork / join 프레임 워크는 더 작은 조각으로 나누어서 병렬로 해결할 수있는 문제에 이상적입니다. 포크 / 조인 문제의 기본 단계는 다음과 같습니다.
- 문제를 여러 조각으로 나눕니다.
- 각 조각들을 서로 평행하게 풀어 라.
- 각 하위 솔루션을 하나의 전체 솔루션으로 결합하십시오.
ForkJoinTask 는 이러한 문제를 정의하는 인터페이스입니다. 일반적으로 인터페이스를 직접 구현하는 것이 아니라 추상 구현 (일반적으로 RecursiveTask ) 중 하나를 서브 클래 싱하는 것이 일반적입니다.
이 예제에서는 10 개 이하의 일괄 처리 크기가 될 때까지 나누어서 정수 컬렉션을 합산합니다.
import java.util.List;
import java.util.concurrent.RecursiveTask;
public class SummingTask extends RecursiveTask<Integer> {
private static final int MAX_BATCH_SIZE = 10;
private final List<Integer> numbers;
private final int minInclusive, maxExclusive;
public SummingTask(List<Integer> numbers) {
this(numbers, 0, numbers.size());
}
// This constructor is only used internally as part of the dividing process
private SummingTask(List<Integer> numbers, int minInclusive, int maxExclusive) {
this.numbers = numbers;
this.minInclusive = minInclusive;
this.maxExclusive = maxExclusive;
}
@Override
public Integer compute() {
if (maxExclusive - minInclusive > MAX_BATCH_SIZE) {
// This is too big for a single batch, so we shall divide into two tasks
int mid = (minInclusive + maxExclusive) / 2;
SummingTask leftTask = new SummingTask(numbers, minInclusive, mid);
SummingTask rightTask = new SummingTask(numbers, mid, maxExclusive);
// Submit the left hand task as a new task to the same ForkJoinPool
leftTask.fork();
// Run the right hand task on the same thread and get the result
int rightResult = rightTask.compute();
// Wait for the left hand task to complete and get its result
int leftResult = leftTask.join();
// And combine the result
return leftResult + rightResult;
} else {
// This is fine for a single batch, so we will run it here and now
int sum = 0;
for (int i = minInclusive; i < maxExclusive; i++) {
sum += numbers.get(i);
}
return sum;
}
}
}
이제이 작업의 인스턴스를 ForkJoinPool 인스턴스에 전달할 수 있습니다.
// Because I am not specifying the number of threads
// it will create a thread for each available processor
ForkJoinPool pool = new ForkJoinPool();
// Submit the task to the pool, and get what is effectively the Future
ForkJoinTask<Integer> task = pool.submit(new SummingTask(numbers));
// Wait for the result
int result = task.join();
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow