반응형
1000만 건의 데이터 크롤링을 할 때, 사용한 자바의 멀티스레드 방식입니다:)
처음에 사이트도 느리고, 데이터의 총량도 가늠할 수 없었던 작업이었는데,
크롤링하다 보니, 사이트에 자꾸 요청을 보내서 서버 다운되기도 했고,
그래서 사이트 운영자가 서버 업그레이드도 해주고..
생각해보니, 정말 재밌던 작업이었어요 :)
이번 글은 이 작업에서 사용한 Java의 멀티스레드 방식을 정리해보려 합니다.
ExecutorService와 Future는 Java에서 병렬 작업을 효율적으로 관리하기 위한 도구입니다.
이 글에서는 Future.get()을 활용하여 작업의 결과를 처리하고 동기화하는 방법을 예제와 함께 설명하겠습니다.
ExecutorService
- 스레드 풀을 생성하고 관리하는 Java의 인터페이스입니다.
- 비동기 작업을 스레드 풀에 제출하여 병렬로 실행할 수 있습니다.
Future
- 비동기 작업의 결과를 나타냅니다.
- 작업의 완료 상태를 확인하거나 결과를 가져올 수 있는 인터페이스입니다.
Future.get()
- 비동기 작업이 완료될 때까지 블로킹 상태로 대기합니다.
- 작업이 성공적으로 완료되면 결과를 반환합니다.
- 작업 중 예외가 발생한 경우, ExecutionException으로 감싸져 예외가 던져집니다.
ExecutorService executorService = Executors.newFixedThreadPool(3);
List<Future<Void>> futures = new ArrayList<>();
for (int i = 0; i < 10; i++) {
final int taskId = i;
futures.add(executorService.submit(() -> {
System.out.println("작업 시작: " + taskId);
Thread.sleep(2000); // 작업 시뮬레이션
System.out.println("작업 완료: " + taskId);
return null; // Void 반환
}));
}
// 작업 결과 확인
for (Future<Void> future : futures) {
try {
future.get(); // 각 작업이 완료될 때까지 대기
} catch (InterruptedException e) {
System.err.println("작업 대기 중 인터럽트 발생: " + e.getMessage());
} catch (ExecutionException e) {
System.err.println("작업 실행 중 예외 발생: " + e.getCause());
}
}
executorService.shutdown();
실행 과정
- 스레드 풀 생성:
- Executors.newFixedThreadPool(3)으로 최대 3개의 작업을 동시에 처리할 수 있는 스레드 풀을 생성합니다.
- 작업 제출:
- 반복문을 통해 10개의 작업을 executorService.submit()으로 제출하고, 각 작업의 Future 객체를 futures 리스트에 추가합니다.
- 작업 완료 대기:
- future.get()을 호출하여 각 작업이 완료될 때까지 기다립니다.
- 작업 중 예외가 발생하면 ExecutionException으로 처리됩니다.
- 스레드 풀 종료:
- 모든 작업이 완료된 후 executorService.shutdown()을 호출하여 스레드 풀을 종료합니다.
반응형
'Java' 카테고리의 다른 글
Java | JAVA의 컴파일 과정 (2) | 2024.12.20 |
---|---|
PostgreSQL, Java | Java Map 객체를 저장할 때 발생하는 문제와 해결방법 (0) | 2024.12.20 |
Java | JIT 컴파일러에 대해 (0) | 2024.12.18 |
Java | HashSet이란? HashSet을 사용하기 좋은 상황(CT) (1) | 2024.12.09 |
Java | 내장 메서드를 활용한 진법 변환 정리 (0) | 2024.12.09 |