Programing/JAVA

Java 병렬처리를 위한 RecursiveAction

리커니 2020. 8. 13.
반응형

Java 병렬처리를 위한 RecursiveAction

 

데이터양이 많을 경우 병렬로 처리를 할때 사용하는 클래스가 RecursiveAction 입니다.

 

같은 기능을 하지만 리턴값이 있을 때는 RecursiveTask 클래스를 활용합니다.

RecursiveTask의 sample code는 다음 포스팅에서 알아보도록 하고, 

이번 포스팅에서는 RecursiveAction에 대해서 알아보도록 하겠습니다. 

 

병렬처리를 위한 클래스에서 RecursiveAction 을 extends 받습니다.

그럼 compute 메소드가 Override되는데 이 메소드 내에서 

병렬처리를 하도록 task를 특정 조건에 따라 구분하여 줍니다.

샘플 코드를 보시죠.

 

[실행코드]

RecursiveTest task = new RecursiveTest(list);
new ForkJoinPool().invoke(task);

 

[RecursiveTest.class]

import java.util.concurrent.ForkJoinTask;
import java.util.concurrent.RecursiveAction;
/*기타 생략*/

public class RecursiveTest extends RecursiveAction{

    private static final long serialVersionUID = 1L;
    private List<TestVO> list;
    private final int cnt = 2;

    public RecursiveTest(List<TestVO> list){
    	super();
        this.list = list;    
    }
    
    @Override
    protected void compute(){
        int size = this.list.size();
        System.out.println(size);
        if(size > this.cnt){
            int i = size/2;
            List<TestVO> list1 = this.list.subList(0, i);
            List<TestVO> list2 = this.list.subList(i, size);
            
            RecursiveTest task1 = new RecursiveTest(list1);
            RecursiveTest task2 = new RecursiveTest(list2);
            ForkJoinTask.invokeAll(task1, task2);
        }else{
            process();
        }
        
    }
    private void process(){
    	for(Iterator<TestVO> itr = this.list.iterator(); itr.hasNext();){
            TestVO vo = itr.next();
            System.out.println(vo.getName());
        }
    }
}

 

위의 코드를 보시면  cnt 변수가 병렬처리를 하는 기준 갯수가 됩니다. 

기준 갯수 보다 클 경우 데이터를 반으로 나누어 처리를 하게 됩니다. 

 

 

'이건1', '이건2', '이건3', '이건4' 4개의 데이터가 있다고 한다면 결과는 아래와 같습니다. 

4
2
이건1
이건2
2
이건3
이건4

 

기준이 되는 cnt 값이 10이고 데이터는 같을 경우의 결과는 아래와 같습니다.

4
이건1
이건2
이건3
이건4

 

이처럼 RecursiveAction을 사용하면 로직을 분할 하여 병렬처리 할 수있습니다.

다음 포스팅에서는 return 값이 있는 recursiveTask에 대해 알아보도록 하겠습니다.

 

반응형

댓글

💲 추천 글