포크 / 가입 프레임 워크는 자바에 도입 된 7 멀티 스레딩 / 병렬 프로그래밍 문제를 해결하기 위해.
동시에 취급하는 것은 매우 어렵다 (평행) 전통적인 방법을 사용하여 프로그래밍. 당신은 스레드 동기화 처리해야하기 때문에, 공고, 등 공유 자원 또한 함정에 가입. 다른 지역 사회의 노력에 의해 입증으로 자바 플랫폼에서 동시 프로그래밍 언어 수준의 지원은 매우 강하다. 이 사회는 모두 멀티 스레드 및 분산 applications.Java 플랫폼과 관련된 통증 점을 추상화 포괄적 인 프로그래밍 모델과 효율적인 구현을 제공하기 위해 노력, 일반용 (자바 SE) 5 다음 자바 SE 6 패키지들의 세트를 도입 (실행 프로그램 서비스)강력한 동시성 빌딩 블록을 제공하는. 자바 SE 7 또한 병렬 처리에 대한 더 많은 지원을 추가하는 프레임 워크를 강화.
포크 / 가입은 자바의 새로운 개념이다 7.0 version. 이러한 구조의 기본적인 목적은 자바 애플리케이션의 멀티 쓰레딩 환경을 용이하게하는 것이다. 미세한 다음 실행 프로그램 서비스 프레임 워크는 포크 / 조인 프레임 워크. 그것은 모든 처리 능력의 이점을 가져 오며, 따라서 애플리케이션은 더 많은 자원 처리 능력을 얻는. 그것은 당신이 다중 프로세서를 활용하는 데 도움이 ExecutorService입니다 인터페이스의 구현입니다. 그것은 빠르게 처리 할 재귀 때문에 작은 조각으로 나눌 수 있습니다 작품을 위해 설계되었습니다.
ExecutorService입니다 유사, 포크는 / 프레임 워크는 스레드 풀의 작업자 스레드에 작업을 분배 가입. 그러나 주요 차이점은 포크 / 틀을 조인하는 작업 도난 알고리즘을 사용. 여기에해야 할 일들이 부족 작업자 스레드는 여전히 바쁘다 다른 스레드에서 작업을 훔칠 수. ForkJoinPoolclass는 AbstractExecutorService의 확장과 프레임 워크의 핵심이다. ForkJoinPool는 핵심 업무 훔치는 알고리즘을 구현하고 ForkJoinTasks을 실행.
지금 나에게 세부 개념을 이해하기 위해 예를 보자.
기본 단계는
· 작업을 분할
· 사용 가능한 스레드에 할당
· 종료 후 청크 가입하고 완료 할
우리가 무작위로 생성 된 정수의 큰 숫자를 포함하는 목록을 보자.
이 클래스는 작업을 할 수있는 전통적인 방법을 보여주고있다.
package javablog.levent.com;
import java.util.Random;
// This class defins a list which will contain large number of integers.
public class LargeInteger {
private final int[] list = new int[2000000];
public largeInteger() {
Random generator = new Random(19580427);
for (int i = 0; i < list.length; i++) {
list[i] = generator.nextInt(500000);
}
}
public int[] getList() {
return list;
}
}
이제 다음 SplitTask 클래스는 분할을 수행하고 작업에 참여한다.
package javablog.levent.com;
import java.util.Arrays;
import jsr166y.forkjoin.RecursiveAction;
public class SplitTask extends RecursiveAction {
private int[] list;
public long result;
public SplitTask(int[] array) {
this.list = array;
}
@ 재정의
보호 무효 계산() {
면 (크고 List.length == 1) {
결과 = 목록[0];
} 그밖에 {
INT의 중간 점 = 크고 List.length / 2;
INT[] L1 = Arrays.copyOfRange(명부, 0, 중간 점);
INT[] L2 = Arrays.copyOfRange(명부, 중간 점, 크고 List.length);
SplitTask S1 = 새로운 SplitTask((L1));
SplitTask S2 = 새로운 SplitTask((L2));
forkJoin((S1), (S2));
결과 = s1.result + s2.result;
}
}
}
지난 시간은 프로세스를 테스트. 이 태스크를 수행하기 ForkJoinExecutor 풀 호출되고.
package javablog.levent.com;
import jsr166y.forkjoin.ForkJoinExecutor;
import jsr166y.forkjoin.ForkJoinPool;
import javablog.levent.com.SplitTask;
public class TestForkJoin {
public static void main(String[] args) {
LargeInteger test = new LargeInteger();
// Check the number of available processors
int nThreads = Runtime.getRuntime().availableProcessors();
System.out.println(nThreads);
SplitTask mfj = new SplitTask(test.getList());
ForkJoinExecutor pool = new ForkJoinPool(nThreads);
pool.invoke(mfj);
long result = mfj.getResult();
System.out.println("Done. Result: " + result);
}
}