상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - 스레드풀의 작업이 완료될 때까지 기다리는 방법은 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
스레드풀(<a href='https://sangseek.com/sangseeks/ThreadPool/ko'>ThreadPool</a>)은 멀티스레딩 환경에서 작업을 효율적으로 관리하기 위해 사용되는 중요한 개념입니다. 스레드풀은 미리 생성된 스레드의 집합으로, 작업이 들어오면 <a href='https://sangseek.com/sangseeks/대기/ko'>대기</a> 중인 스레드가 이를 처리합니다. 이로 인해 스레드를 매번 생성하고 소멸시키는 오버헤드를 줄일 수 있습니다. 그러나 스레드풀에서 수행되는 작업이 완료될 때까지 기다려야 하는 경우가 종종 있습니다. 이때 사용할 수 있는 여러 가지 방법이 있습니다. 1. `Future` 객체 사용하기 Java의 `ExecutorService`를 사용하여 스레드풀에서 작업을 제출할 때, `submit()` 메서드는 `Future` 객체를 반환합니다. 이 객체는 작업의 결과를 나타내며, `get()` 메서드를 호출하여 작업이 완료될 때까지 기다릴 수 있습니다. ```java ExecutorService executor = Executors.newFixedThreadPool(10); Future<ResultType> future = executor.submit(() -> { // 작업 수행 return result; }); try { ResultType result = future.get(); // 작업 완료까지 대기 } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } finally { executor.shutdown(); } ``` 2. `CountDownLatch` 사용하기 `CountDownLatch`는 특정 작업이 완료될 때까지 대기할 수 있는 동기화 도구입니다. 여러 개의 작업이 있을 때, 각 작업이 완료될 때마다 카운트를 감소시키고, 카운트가 0이 될 때까지 대기할 수 있습니다. ```java ExecutorService executor = Executors.newFixedThreadPool(10); CountDownLatch latch = new CountDownLatch(numberOfTasks); for (int i = 0; i < numberOfTasks; i++) { executor.submit(() -> { try { // 작업 수행 } finally { latch.countDown(); // 작업 완료 시 카운트 감소 } }); } latch.await(); // 모든 작업이 완료될 때까지 대기 executor.shutdown(); ``` 3. `CompletionService` 사용하기 `CompletionService`는 작업이 완료되는 대로 결과를 가져올 수 있는 구조입니다. `ExecutorCompletionService`를 사용하면, 작업이 완료될 때마다 결과를 가져올 수 있습니다. ```java ExecutorService executor = Executors.newFixedThreadPool(10); CompletionService<ResultType> completionService = new ExecutorCompletionService<>(executor); for (int i = 0; i < numberOfTasks; i++) { completionService.submit(() -> { // 작업 수행 return result; }); } for (int i = 0; i < numberOfTasks; i++) { try { Future<ResultType> future = completionService.take(); // 완료된 작업 대기 ResultType result = future.get(); // 결과 가져오기 } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } } executor.shutdown(); ``` 4. `ForkJoinPool` 사용하기 Java 7부터 도입된 `ForkJoinPool`은 작업을 분할하고 병렬로 처리하는 데 최적화된 스레드풀입니다. `ForkJoinTask`를 사용하여 작업을 제출하고, `invokeAll()` 메서드를 통해 모든 작업이 완료될 때까지 대기할 수 있습니다. ```java ForkJoinPool <a href='https://sangseek.com/sangseeks/fork/ko'>fork</a>JoinPool = new ForkJoinPool(); List<ForkJoinTask<ResultType>> tasks = new ArrayList<>(); for (int i = 0; i < numberOfTasks; i++) { tasks.add(forkJoinPool.submit(() -> { // 작업 수행 return result; })); } ForkJoinTask.invokeAll(tasks); // 모든 작업 완료 대기 forkJoinPool.shutdown(); ``` 결론 스레드풀의 작업이 완료될 때까지 기다리는 방법은 여러 가지가 있으며, 각 방법은 특정 상황에 따라 <a href='https://sangseek.com/sangseeks/장단점/ko'>장단점</a>이 있습니다. `Future` 객체를 사용하면 간단하게 작업 결과를 얻을 수 있고, `CountDownLatch`는 여러 작업을 동시에 관리할 때 유용합니다. `CompletionService`는 작업이 완료되는 대로 결과를 처리할 수 있는 장점이 있으며, `ForkJoinPool`은 대규모 병렬 처리에 적합합니다. 상황에 맞는 방법을 선택하여 효율적으로 스레드풀의 작업을 관리하세요.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기