Fork/Join 프레임워크는 Java 7에 도입된 java.util.concurrent 패키지의 일부입니다. 이는 각 청크를 처리할 수 있는 더 작은 청크로 재귀적으로 나눌 수 있는 작업을 위해 설계되었습니다. 독립적으로. 프레임워크는 분할 정복 원칙에 따라 작동하므로 정렬, 검색 및 기타 재귀 알고리즘과 같은 작업에 이상적입니다.
ForkJoinTask는 Fork/Join 프레임워크 내에서 실행할 수 있는 작업의 기본 클래스입니다. 작업이 새 하위 작업을 포크하고 완료되면 결합할 수 있는 핵심 작업을 제공합니다.
예:
import java.util.concurrent.RecursiveTask; public class SumTask extends RecursiveTask<Integer> { private final int[] arr; private final int start, end; public SumTask(int[] arr, int start, int end) { this.arr = arr; this.start = start; this.end = end; } @Override protected Integer compute() { if (end - start <= 10) { int sum = 0; for (int i = start; i < end; i++) { sum += arr[i]; } return sum; } else { int mid = (start + end) / 2; SumTask leftTask = new SumTask(arr, start, mid); SumTask rightTask = new SumTask(arr, mid, end); leftTask.fork(); int rightResult = rightTask.compute(); int leftResult = leftTask.join(); return leftResult + rightResult; } } }
ForkJoinPool은 ForkJoinTask 인스턴스를 실행하기 위해 작업자 스레드 풀을 관리하는 중앙 클래스입니다. 작업 도용 알고리즘을 사용하여 바쁜 스레드에서 유휴 스레드로 작업을 재분배하여 모든 스레드를 바쁜 상태로 유지합니다.
예:
import java.util.concurrent.ForkJoinPool; public class ForkJoinExample { public static void main(String[] args) { int[] arr = new int[100]; for (int i = 0; i < arr.length; i++) { arr[i] = i + 1; } ForkJoinPool pool = new ForkJoinPool(); SumTask task = new SumTask(arr, 0, arr.length); int result = pool.invoke(task); System.out.println("Sum: " + result); } }
RecursiveTask 는 작업이 결과를 반환할 때 사용되고, RecursiveAction은 결과를 반환하지 않을 때 사용됩니다.
RecursiveAction을 사용한 예:
import java.util.concurrent.RecursiveAction; public class PrintTask extends RecursiveAction { private final int[] arr; private final int start, end; public PrintTask(int[] arr, int start, int end) { this.arr = arr; this.start = start; this.end = end; } @Override protected void compute() { if (end - start <= 10) { for (int i = start; i < end; i++) { System.out.print(arr[i] + " "); } System.out.println(); } else { int mid = (start + end) / 2; PrintTask leftTask = new PrintTask(arr, start, mid); PrintTask rightTask = new PrintTask(arr, mid, end); invokeAll(leftTask, rightTask); } } }
ForkJoinExample을 실행하면 배열 요소의 합계가 출력됩니다. Fork/Join 프레임워크는 작업을 더 작은 청크로 나누고 병렬로 처리하여 특히 대규모 데이터 세트의 경우 상당한 성능 향상을 보여줍니다.
예를 들어 1부터 100까지의 숫자를 합하면 다음과 같습니다.
Sum: 5050
PrintTask 의 경우 프레임워크는 배열 인쇄 작업을 나누어 병렬로 실행하고 세그먼트를 동시에 출력합니다.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 ...
포크/조인 프레임워크는 병렬 처리 작업을 최적화하기 위한 Java의 강력한 도구입니다. 작업을 더 작은 하위 작업으로 나누고 독립적으로 실행한 다음 결합하여 최종 결과를 생성할 수 있는 시나리오에서 탁월합니다. 복잡성이 발생하지만 멀티 코어 환경의 성능 이점이 단점보다 더 큰 경우가 많으므로 CPU 제한 및 대규모 재귀 문제에 탁월한 선택이 됩니다.
에서 더 많은 게시물을 읽어보세요. Java의 Fork/Join 프레임워크란 무엇인가요?
위 내용은 Java의 Fork/Join 프레임워크란 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!