스레드풀의 작업이 완료될 때까지 대기하는 방법은 무엇인가요?
_____A: 스레드풀 작업 완료 대기 방법은 주로 사용하는 프로그래밍 언어와 스레드풀 구현에 따라 다르지만, 대표적으로 다음과 같은 방법들이 있습니다.
---
1. 자바 (Java)에서 스레드풀 작업 완료 대기
방법 1: `shutdown()` + `awaitTermination()`
- 설명: 스레드풀에 더 이상 작업을 제출하지 않도록 `shutdown()`을 호출한 뒤, `awaitTermination()` 메서드로 모든 작업이 완료될 때까지 기다립니다.
- 예시:
```java
ExecutorService executor = Executors.newFixedThreadPool(5);
// 작업 제출
executor.submit(() -> {
// 작업 내용
});
// 작업 추가 종료 신호
executor.shutdown();
try {
// 최대 1시간 대기
if (!executor.awaitTermination(1, TimeUnit.HOURS)) {
executor.shutdownNow(); // 강제 종료
}
} catch (InterruptedException e) {
executor.shutdownNow();
Thread.currentThread().interrupt();
}
```
방법 2: `invokeAll()` 사용
- 설명: 여러 작업을 한꺼번에 제출하고, 해당 메서드가 반환될 때까지 대기합니다.
- 예시:
```java
List
ExecutorService executor = Executors.newFixedThreadPool(5);
List
// 모든 작업 완료 후 코드 진행
```
---
- 설명: 스레드풀에 제출된 모든 Future 객체에 대해 `result()`를 호출하거나, `shutdown(wait=True)`를 호출해 모든 작업 완료를 기다릴 수 있습니다.
- 예시:
```python
from concurrent.futures import ThreadPoolExecutor
with ThreadPoolExecutor(max_workers=5) as executor:
futures = [executor.submit(some_function, arg) for arg in args]
개별 작업 완료 대기
for future in futures:
result = future.result()
또는 simply
executor.shutdown(wait=True) with 구문 내에서는 자동 호출됨
```
---
3. C 에서 `ThreadPool` 또는 `Task` 사용 시
- 설명: C 에서는 직접 `ThreadPool`의 모든 작업 완료를 기다리기 어렵지만, `Task` 기반 비동기 작업에서는 `Task.WaitAll()`로 모든 작업 완료를 대기할 수 있습니다.
- 예시:
```csharp
Task[] tasks = new Task[10];
for (int i = 0; i < tasks.Length; i++)
{
tasks[i] = Task.Run(() => {
// 작업 내용
});
}
Task.WaitAll(tasks); // 모든 작업 완료 대기
```
---
요약
|언어/플랫폼|스레드풀 작업 완료 대기 방법|
|---|---|
|Java|`ExecutorService.shutdown()` + `awaitTermination()` 사용|
|Python|`ThreadPoolExecutor.shutdown(wait=True)` 또는 각 Future의 `result()` 호출|
|C |비동기 작업에 대해서 `Task.WaitAll()` 사용|
---
주의:
- 무한 대기를 원하지 않는 경우, 타임아웃을 설정해 대기 시간을 제한하는 것이 좋습니다.
- 강제 종료(`shutdownNow()` 등)는 자원 누수 및 데이터 손상 위험이 있으므로 신중히 사용하세요.
스레드풀은 미리 생성된 스레드의 집합으로, 작업이 들어오면 대기 중인 스레드가 이를 처리합니다.
스레드풀의 작업이 완료될 때까지 대기하는 방법은 여러 가지가 있으며, 주로 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.shutdown(); } ```
2. invokeAll() 메서드 사용 여러 작업을 동시에 제출하고, 모든 작업이 완료될 때까지 대기하려면 `invokeAll()` 메서드를 사용할 수 있습니다.
이 메서드는 작업 리스트를 받아들이고, 모든 작업이 완료될 때까지 블록합니다.
```java ExecutorService executor = Executors.newFixedThreadPool(
5); List<Callable
작성자:
김예빈 [비회원]
| 작성일자: 1년 전
2024-11-21 22:51:48
조회수: 148 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
조회수: 148 | 댓글: 0 | 좋아요: 0 | 싫어요: 0
내용이 부정확하다면 싫어요를 클릭해주세요.