Fork/Join 프레임 워크는 ExecutorService 인터페이스의 구현으로 여러 프로세스를 구현할 수 있습니다. Fork/Join은 모든 리소스를 최대한 활용하여 가능한 한 많은 응용 프로그램의 성능을 향상시키기 위해 큰 작업을 여러 개의 작은 작업으로 재귀 적으로 분할하는 데 사용될 수 있습니다.
모든 ExecutorService 인터페이스 구현과 마찬가지로 Fork/Join은 스레드 풀을 사용하여 작업자 스레드를 분배적으로 관리합니다. Fork/Join 프레임 워크의 독특한 점은 작업 도난 알고리즘을 사용한다는 것입니다. 이 알고리즘을 통해 작업자 스레드는 다른 바쁜 스레드 작업을 훔쳐서 아무것도 수행 할 수없는 경우 실행할 수 있습니다.
Fork/Join 프레임 워크의 핵심은 AbstractExecutorservice 클래스의 서브 클래스 인 Forkjoinpool 클래스입니다. Forkjoinpool은 핵심 워크 스테이킹 알고리즘을 구현하고 Forkjointask 처리를 수행 할 수 있습니다.
기본 사용
Fork/Join 프레임 워크를 사용하는 첫 번째 단계는 단편화 된 작업을 수행하는 코드를 작성하는 것입니다. 작성할 코드는 다음 의사 코드와 유사합니다.
작업이 충분히 작은 경우 : 작업을 직접 실행하십시오. 다른 작업을 직접 실행하십시오 : 두 가지 작은 작업으로 작업을 자르고 두 개의 작은 작업을 실행하고 결과를 기다립니다.
Forkjointask 서브 클래스를 사용하여 위와 같이 코드를 캡슐화하십시오. 일반적으로 RECURSIVETASK (이 클래스는 결과를 반환) 및 재귀 반응을 포함하여 JDK가 제공하는 일부 클래스가 사용됩니다.
Forkjointask 서브 클래스를 준비한 후 모든 작업을 나타내는 객체를 작성하여 Forkjoinpool 인스턴스의 invoke () 메소드로 전달하십시오.
흐림부터 명확하게
포크/조인 프레임 워크의 작동 방식을 이해하기 위해 예를 들어 이미지를 흐리게하는 경우를 설명합니다. 정수 배열을 사용하여 이미지를 나타냅니다. 여기서 각 숫자 값은 픽셀의 색상을 나타냅니다. 흐릿한 이미지는 또한 같은 길이의 배열로 표시됩니다.
블러 실행은 그림을 나타내는 각 픽셀을 처리하여 달성됩니다. 각 픽셀의 평균과 주변 픽셀 (빨간색, 노란색 및 파란색의 세 가지 기본 색상의 평균)을 계산하고 결과의 결과 배열은 흐릿한 그림입니다. 이미지의 표현은 일반적으로 큰 배열이므로 전체 프로세스는 일반적으로 많은 시간이 걸립니다. 포크/조인 프레임 워크는 멀티 프로세서 시스템에서 동시 처리의 장점을 활용하여 속도를 높이는 데 사용될 수 있습니다. 가능한 구현은 다음과 같습니다.
패키지 com.zhyea.robin; java.util.concurrent.recursiveAction import; 공개 클래스 포크 블러는 재귀 반응 {private int [] msource; 개인 INT MSTART; 개인 int mlength; 개인 int [] mdestination; // 손잡이 창 크기; 홀수가 필요합니다. 개인 int mblurwidth = 15; public forkblur (int [] src, int start, int length, int [] dst) {msource = src; mstart = 시작; mlength = 길이; mdestination = dst; } protected void computeDirectly () {int sidepixels = (mblurwidth -1) / 2; for (int index = mstart; index <mstart+mlength; index ++) {// 평균 값을 계산합니다. float rt = 0, gt = 0, bt = 0; for (int mi = -sidePixels; int pixel = msource [mindex]; rt += (float) ((픽셀 & 0x00ff0000) >> 16) / mblurwidth; gt += (float) ((픽셀 & 0x00000ff00) >> 8) / mblurwidth; bt += (float) ((픽셀 & 0x000000ff) >> 0) / mblurwidth; } // 대상 픽셀을 재구성합니다. int dpixel = (0xff0000000) | (((int) rt) << 16) | (((int) gt) << 8) | (((int) bt) << 0); mdestination [index] = dpixel; }} ....}이제 퍼지 작업이 구현되고 작업을 두 가지 작은 작업으로 분할하는 추상 메소드 Compute ()를 구현합니다. 여기서 우리는 단순히 작업을 직접 실행할지 여부를 결정하거나 배열의 길이에 따라 두 개의 작은 작업으로 분할할지 결정합니다.
보호 된 정적 int sthreshold = 100000; Protected void compute () {if (mlength <sthreshold) {computedirectly (); 반품; } int split = mlength / 2; Invokeall (New Forkblur (Msource, Mstart, Split, Mdestination), New Forkblur (Msource, Mstart + Split, Mlength- 분할, Mdestination)); }상기 방법의 구현은 재귀 전환의 서브 클래스로 정의되기 때문에, 작업을 생성하고 ForkjoinPool에서 직접 실행할 수 있습니다. 특정 단계는 다음과 같습니다.
1. 수행 할 작업을 나타내는 개체를 만듭니다.
// src는 소스 이미지의 픽셀 배열을 나타냅니다. // dst는 생성 된 이미지 포크 블러 fb = new Forkblur (src, 0, src.length, dst)의 픽셀을 나타냅니다.
2. 작업을 실행하는 포크 조이 풀 인스턴스를 만듭니다.
ForkJoinPool pool = new ForkJoinPool();
3. 작업 실행 :
pool.invoke(fb);
소스 코드에는 대상 이미지를 만들기위한 일부 코드도 포함되어 있습니다. 자세한 내용은 포크 블러 예를 참조하십시오.
표준 구현
Fork/Join 프레임 워크를 사용하여 사용자 지정 알고리즘에 따라 멀티 코어 시스템에서 동시 작업을 실행하려면 사용자 정의 클래스 (예 : 이전에 구현 한 Forkblur 클래스)를 구현해야합니다. 또한, 포크/조인 프레임 워크의 일부 기능은 Javase에서 널리 사용되었습니다. 예를 들어, java8의 java.util.arrays 클래스의 parallelsort () 메소드는 포크/조인 프레임 워크를 사용합니다. 자세한 내용은 Java API 문서를 참조하십시오.
포크/조인 프레임 워크의 또 다른 구현은 java.util.streams 패키지 아래에 있으며 Java8의 Lambda 기능의 일부입니다.