상식닷컴
로그인
가입하기
2026년 상식닷컴 선정 식당 & 카페 리스트
2025년 2026년 신상 호텔 리스트
최근에 오픈한 호텔을 찾는다면 살펴보세요
일주일 식단표 어플
자동 일주일 식단표 어플
안드로이드
아이폰
주식 & 코인 차트의 신
1000만원으로 2000만원 만들기 프로젝트
수정하기 - 스레드풀의 작업이 완료될 때까지 대기하는 방법은 무엇인가요?
닉네임
비밀번호
제목
내용
[이미지 업로드는 권한이 있는 사람만 가능. 하단 카톡으로 연락]
스레드풀(ThreadPool)은 멀티스레딩 환경에서 작업을 효율적으로 처리하기 위해 사용되는 중요한 구성 요소입니다. 스레드풀은 미리 생성된 스레드의 집합으로, 작업이 들어오면 대기 중인 스레드가 이를 처리합니다. 스레드풀의 작업이 완료될 때까지 대기하는 방법은 여러 가지가 있으며, 주로 Java와 같은 프로그래밍 언어에서 사용되는 ExecutorService를 통해 설명할 수 있습니다. 1. ExecutorService와 Future Java에서는 `ExecutorService` 인터페이스를 사용하여 스레드풀을 관리할 수 있습니다. 작업을 제출할 때 `submit()` 메서드를 사용하면 `Future` 객체가 반환됩니다. 이 `Future` 객체를 통해 작업의 완료 여부를 확인하고, 결과를 가져올 수 있습니다. ```java ExecutorService executor = Executors.newFixedThreadPool(5); Future<?> future = executor.submit(() -> { // 작업 내용 }); // 작업이 완료될 때까지 대기 try { future.get(); // 이 메서드는 작업이 완료될 때까지 블록됩니다. } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } finally { executor.<a href='https://sangseek.com/sangseeks/shutdown/ko'>shutdown</a>(); } ``` 2. invokeAll() 메서드 사용 여러 작업을 동시에 제출하고, 모든 작업이 완료될 때까지 대기하려면 `invokeAll()` 메서드를 사용할 수 있습니다. 이 메서드는 작업 리스트를 받아들이고, 모든 작업이 완료될 때까지 블록합니다. ```java ExecutorService executor = Executors.newFixedThreadPool(5); List<<a href='https://sangseek.com/sangseeks/Callable/ko'>Callable</a><Object>> tasks = new ArrayList<>(); // 작업 추가 tasks.add(() -> { // 작업 내용 return <a href='https://sangseek.com/sangseeks/null/ko'>null</a>; }); // 모든 작업이 완료될 때까지 대기 try { List<Future<Object>> results = executor.invokeAll(tasks); for (Future<Object> result : results) { result.get(); // 각 작업의 결과를 가져옵니다. } } catch (InterruptedException | ExecutionException e) { e.printStackTrace(); } finally { executor.shutdown(); } ``` 3. CountDownLatch 사용 `CountDownLatch`를 사용하여 특정 작업이 완료될 때까지 대기할 수도 있습니다. 이 방법은 여러 스레드가 작업을 수행하고, 모든 작업이 완료될 때까지 메인 스레드가 대기하도록 할 수 있습니다. ```java ExecutorService executor = Executors.newFixedThreadPool(5); CountDownLatch latch = new CountDownLatch(1); executor.submit(() -> { try { // 작업 내용 } finally { latch.countDown(); // 작업이 완료되면 카운트를 감소시킵니다. } }); // 작업이 완료될 때까지 대기 try { latch.await(); // 카운트가 0이 될 때까지 대기합니다. } catch (InterruptedException e) { e.printStackTrace(); } finally { executor.shutdown(); } ``` 4. CyclicBarrier 사용 `CyclicBarrier`를 사용하면 여러 스레드가 특정 지점에서 모두 도달할 때까지 대기할 수 있습니다. 이 방법은 여러 스레드가 동시에 작업을 수행하고, 특정 조건이 충족될 때까지 대기해야 할 때 유용합니다. ```java ExecutorService executor = Executors.newFixedThreadPool(5); CyclicBarrier barrier = new CyclicBarrier(5); // 5개의 스레드가 필요 for (int i = 0; i < 5; i++) { executor.submit(() -> { try { // 작업 내용 barrier.await(); // 모든 스레드가 이 지점에 도달할 때까지 대기 } catch (InterruptedException | BrokenBarrierException e) { e.printStackTrace(); } }); } // 모든 스레드가 완료될 때까지 대기 executor.shutdown(); ``` 결론 스레드풀의 작업이 완료될 때까지 대기하는 방법은 여러 가지가 있으며, 각 방법은 특정 상황에 따라 적합할 수 있습니다. `Future`, `invokeAll()`, `CountDownLatch`, `CyclicBarrier` 등 다양한 도구를 활용하여 멀티스레딩 환경에서 효율적으로 작업을 관리하고, 필요한 경우 대기할 수 있습니다. 이러한 방법들을 적절히 활용하면, 스레드풀을 통해 비동기 작업을 효과적으로 처리할 수 있습니다.
이용안내
커뮤니티 이용안내
×
- 게시한 게시글로 발생하는 문제는 게시자에게 책임이 있습니다.
- 게시글이 타인/타업체의 저작권을 침해할 경우 모든 책임은 게시자에게 있습니다. 게시자가 모든 손해를 부담해야 합니다.
- 상식닷컴 운영자는 게시자와 상의하지 않고 게시글을 수정 또는 삭제할 수 있습니다.
- 상식닷컴 운영자는 깨끗한 커뮤니티 공간을 만드는 것이 1순위입니다.
수정하기
취소하기