Java 7의 Recursive Task
계산량이 아주 많거나 문제사이즈가 클 경우 쓰레드 별로 문제를 분리해서 Multi Thread방식으로 계산할 수 있도록 합니다.
출처:
http://homes.cs.washington.edu/~djg/teachingMaterials/grossmanSPAC_forkJoinFramework.html
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.RecursiveTask;
public class SumRecursiveTask extends RecursiveTask<Long> {
static ForkJoinPool fjPool = new ForkJoinPool();//ForkJoin을 위한 Thread Pool
static final int THRESHOLD = 100;
int low;
int high;
int[] array;
public SumRecursiveTask(int[] arr, int lo, int hi) {
array = arr;
low = lo;
high = hi;
}
@Override
protected Long compute() {
if(high - low < THRESHOLD){//일정수량 미만으로 떨어지면 계산수행
long sum = 0;
for(int i = low; i < high; ++i){
sum += (array[i]);
}
return sum;
}else{
int mid = low + (high - low) / 2;
SumRecursiveTask left = new SumRecursiveTask(array, low, mid);
SumRecursiveTask right = new SumRecursiveTask(array, mid, high);
left.fork(); //신규 Thread 분리지점 (fork되어 생성)
long rightAns = right.compute();//현재 Thread로 계산하도록 호출
long leftAns = left.join(); //분리된 Thread가 다시 합쳐지는 지점
return leftAns + rightAns;
}
}
public static long sumArray(int[] array){
return fjPool.invoke(new SumRecursiveTask(array, 0, array.length));
}
public static void main(String[] args){
int[] array = new int[1000];
int size = array.length;
for(int i=0; i < size; ++i) {
array[i] = i;
}
long start = System.currentTimeMillis();
long result = SumRecursiveTask.sumArray(array);
long end = System.currentTimeMillis();
System.out.println("Time=" + (end - start));
System.out.println("Result=" + result);
}
}
'Programming > JAVA' 카테고리의 다른 글
Java 7의 Recursive Task (0) | 2014.11.05 |
---|---|
Regular Expression, Pattern, Matcher (0) | 2012.10.16 |
Java Pattern, Matcher 정규표현식 사용 검색 (0) | 2012.10.04 |
자바 디컴파일러 링크 (0) | 2012.06.07 |
Maven Junit테스트 실행 생략처리 (0) | 2012.06.05 |
Java Web Start 및 GWT관련 (0) | 2012.05.21 |