일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
- gtihub
- IntelliJ
- db종류
- java
- MariaDB
- Jenkins
- git branch 삭제
- TIOBE
- pat발급
- ANTIFRAGILE
- JPA
- 티스토리챌린지
- ci/cd
- spring
- Python
- jetbrain
- github
- UNION ALL
- JPQL
- docker
- visual studio code
- EntityManager
- 명령어
- 르세라핌
- analytics4
- 자동배포
- git pat
- 오블완
- 애널리틱스4
- Today
- Total
hanker
JAVA - 멀티쓰레드(Multi Thread) 반복문 병렬처리 방법 본문
개발을 하다보면 반복문은 무수히 많이 쓰인다.
반복문이 반복횟수가 많아지면 시간이 오래걸리고 보다 더 빠르게 처리해야 되는데, 반복문 안에 있는 코드를 더 이상 최적화 시킬 수 없을 경우에는 좌절하게 된다..
( 물론 단순 연산처리나 작업 자체가 복잡하지 않으면 멀티쓰레드 오버헤드 때문에 병렬 처리의 성능 이점이 사라지고 더 느려질 수 있음 )
그럴 때 사용하게 되는 멀티쓰레드 방식을 정리해본다.
1. Parallel Stream (병렬 스트림)
2. ExecutorService
- Parallel Stream
Java 8버전에서 제공하는 Stream API에는 병렬처리할 수 있는 기능이 있다.
스트림을 병렬로 처리하면 내부적으로 포크-조인 풀(Fork-Join Pool)을 사용하여 멀티 코어를 활용한다.
사용 예제
- 예제 코드
public static void main(String[] args) throws Exception {
List<Map<String, Object>> list = new ArrayList<>();
for (int i = 0; i < 200000; i++) {
Map<String, Object> map = new HashMap<>();
map.put("number", i);
list.add(map);
}
list.parallelStream().forEach(number -> {
System.out.println("쓰레드 : " + Thread.currentThread().getName() + ", 값 : " + number);
});
}
결과 :
여러 쓰레드가 동작되는걸 확인할 수 있다.
- ExecutorService
위 Stream이 나오기 이전에 사용되었던 멀티쓰레드 방법이다. Java 5 버전 이상에서 사용된다.
- 예제 코드
public static void main(String[] args) throws Exception {
List<Map<String, Object>> list = new ArrayList<>();
for (int i = 0; i < 200000; i++) {
Map<String, Object> map = new HashMap<>();
map.put("number", i);
list.add(map);
}
ExecutorService executor = Executors.newFixedThreadPool(8); // 8개의 쓰레드 생성
for(int i = 0 ; i < list.size() ; i++) {
final int number = Integer.parseInt(list.get(i).get("number").toString());
executor.submit(() -> {
System.out.println(Thread.currentThread().getName() + " : " + number);
});
}
executor.shutdown(); // 모든 작업이 끝난 후 쓰레드 종료
}
결과.
잘 실행되는 걸 확인할 수 있다. ExecutorService 의 사용 방법은 훨씬 더 많지만, 이 글에서 예제는 간단하게 구현했다.
더 세밀한 제어가 필요하다면 Parallel Stream 보다 ExecutorService를 사용해야한다.
끝으로 멀티쓰레드 방식이 무조건 좋다 이런건 아니다. 그리고 DB에 영속성 처리를 해야 할 경우에도 동시성 문제가 생길 수 있어서 주의가 필요하다. 각 프로세스에 맞게 이용하고 사용했으면 좋겠다.
끝.
'JAVA' 카테고리의 다른 글
JAVA - HttpUrlConnection, HttpsUrlConnection (Content-Type 설정) (2) (0) | 2024.10.20 |
---|---|
JAVA - 멀티 쓰레드 연산처리 (AtomicInteger) (0) | 2024.10.12 |
Java - (Window/Linux) 디렉터리 목록 가져오기 (1) | 2024.09.20 |
JAVA - Lambda (java 8) (0) | 2024.09.15 |
JAVA - stream (1) | 2024.09.13 |