언어/JAVA

java 모던자바 람다 스트림 - 병렬 처리 테스트

벨포트조던 2022. 8. 16.
반응형

배경

- 병렬 처리 가동시 정상 작동하는지 확인하기 위해 테스트 코드 작성

- 병렬로 1부터 n 까지 더했을시 동기화 문제가 발생하지 않고 정상작동하나 확인 

 

코드는 아래에... 

 

알게된 정보

 

1. 그냥 int 로 더하는 작업하면, 정상값이 나오지 않는다.

atomicint로 사용해야 제대로 된 값이 나옴

2. parallel 사용시 메인쓰레드에서 돌아서, forkjoinpool 를 사용해야 한다고한다.

안쓰면 메인쓰레드만 사용해서 서버 죽을수있다는 경험을 전해들음

 

그래서, 다른 쓰레드로 동작하도록 하기 위해 forkjoinpool 을 사용한다.

 

package io.swagger.service;

import java.util.HashMap;
import java.util.Map;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ForkJoinPool;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicLong;
import java.util.stream.IntStream;

public abstract class Test {

	public static void main(String[] args) throws InterruptedException, ExecutionException {
		// TODO Auto-generated method stub
		int[] total= {0};
		long beforeTime = System.currentTimeMillis(); //코드 실행 전에 시간 받아오기
        
		Map<String,AtomicLong> map=new HashMap();
		AtomicLong atomicInt = new AtomicLong(0);
		map.put("sum", atomicInt);
		ForkJoinPool myPool = new ForkJoinPool(5);
		myPool.submit(() -> {
			IntStream.range(1, 100001).parallel().forEach(i -> test2(i, map.get("sum")));
			
			System.out.println(atomicInt.get());
			System.out.println((100000L*100001L)/2L);
		}).get();
		
//		IntStream.range(1, 100001).parallel().forEach(i -> test2(i, atomicInt));
//		System.out.println(Arrays.toString(atomicInt));
//		System.out.println((100000*100001)/2);
//		System.out.println(atomicInt.get());
//		System.out.println((100000*100001)/2);
		
		//실험할 코드 추가
        
				long afterTime = System.currentTimeMillis(); // 코드 실행 후에 시간 받아오기
				long secDiffTime = (afterTime - beforeTime); //두 시간에 차 계산
				System.out.println("시간차이(m) : "+secDiffTime);
		
		
		
	}
	public static void test2(int aa,int[] sum) {
		System.out.println(aa);
		sum[0] += aa;
		
	}

	public static void test2(int aa,AtomicLong sum) {
		System.out.println(aa);
		
        sum.updateAndGet(n -> aa+n);
//        try {
//			Thread.sleep(5);
//		} catch (InterruptedException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		
	}

}
반응형

댓글