fork & join 프레임웤 : 하나의 작업을 작은 단위로 나눠서 여러 쓰레드가 동시에 처리하는것을 쉽게 만들어 준다.
수행할 작업에 따라 RecursiveAction, RecursiveTask 두 클래스중 하나를 상속받아 구현해야 한다.
RecursiveAction : 반환값이 없는 작업을 구현할때
RecursiveTask : 반환값이 있는 작업을 구현할 때
두 클래스 모두 compute()라는 추상메서드를 가지고있는데 상속을 통해 compute()메소드를 구현하고 작동시키면된다.
compute()를 구현한 후 쓰레드 풀과 수행할 작업(compute()가 구현된 객체)을 생성해 준다.
이후 start가 아닌 invoke()를 통해 작업을 시작한다.
ex)
ForkJoinPool pool = new ForkJoinPool();
SumTask task = new SumTask(from, to);
Long result = pool.invoke(task); //invoke()를 통해 생성한 작업시작
fork()와 join()
fork() : 작업을 쓰레드의 작업 큐에 넣는것이다. 작업큐에 들어간 작업은 더이상 나눌 수 없을때까지 나뉜다. 비동기 메서드이다.
join() : 해당 작업의 수행이 끝날 때까지 기다렸다가 수행이 끝나면 그 결과를 반환한다. 동기메서드이다.
rightSum.compute를 통해 계속 반으로 나눈 계산의 왼쪽 계산을 fork한다. 그리고 size가 5이하가되면 계산을 실행한다.
쓰레드를 많이사용한것이 시간은 더오래걸린다. 작업을 나누고 합치는데 시간이 걸리기 때문이다.
항상 멀티쓰레드가 빠른것이 아니기 때문에 항상 테스트해보고 더빠를경우에만 멀티쓰레드를 사용하는것이 좋다.
'Programming > JAVA' 카테고리의 다른 글
다양한 함수형 인터페이스 & 메서드 참조 (0) | 2021.08.22 |
---|---|
람다식(Lambda expression) (0) | 2021.08.21 |
쓰레드의 동기화 (0) | 2021.08.20 |
쓰레드의 상태 및 제어 (0) | 2021.08.16 |
데몬 쓰레드(daemon thread) (0) | 2021.08.13 |