'2014/11/05'에 해당되는 글 1건

  1. 2014.11.05 Java 7의 Recursive Task

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