반응형
배경
- 병렬 처리 가동시 정상 작동하는지 확인하기 위해 테스트 코드 작성
- 병렬로 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();
// }
}
}
반응형
'언어 > JAVA' 카테고리의 다른 글
Java8 Parallel Stream, 효율적으로 사용해야합니다. 람다 (0) | 2024.05.07 |
---|---|
자바 8 Stream API 과 주의사항 (0) | 2022.06.29 |
가비지컬렉션 GC heap dump 분석 (0) | 2021.06.03 |
json 변환시 urlencode 발생 해결방볍 (0) | 2021.03.17 |
옵저버 패턴 참조 사이트 (0) | 2020.07.28 |
댓글