- 생성 (Creation)
- ExecutorService 인스턴스를 생성합니다. 이는 스레드 풀을 초기화하는 과정입니다.
- 예: ExecutorService executor = Executors.newFixedThreadPool(4);
- 작업 제출 (Task Submission)
- 작업을 스레드 풀에 제출합니다. submit() 또는 execute() 메서드를 사용하여 Runnable 또는 Callable 작업을 제출할 수 있습니다.
- 예: executor.submit(new SimpleTask());
- 작업 실행 (Task Execution)
- 스레드 풀 내의 스레드가 대기 중인 작업을 실행합니다. 스레드는 작업을 처리하고 완료하면 다시 대기 상태로 돌아가 다른 작업을 기다립니다.
- 예: new SimpleTask().run();
- 종료 요청 (Shutdown Request)
- 더 이상 새로운 작업을 받지 않도록 shutdown() 메서드를 호출합니다. 이미 제출된 작업들은 모두 완료될 때까지 계속 실행됩니다.
- 예: executor.shutdown();
- 종료 대기 (Await Termination)
- 스레드 풀의 모든 작업이 완료될 때까지 대기합니다. awaitTermination() 메서드를 사용하여 특정 시간 동안 대기할 수 있습니다.
- 예: executor.awaitTermination(60, TimeUnit.SECONDS);
- 강제 종료 (Forced Shutdown)
- 특정 시간 내에 모든 작업이 완료되지 않으면 shutdownNow() 메서드를 호출하여 실행 중인 작업을 중단하고 강제로 스레드 풀을 종료할 수 있습니다.
- 예: executor.shutdownNow();
- 자원 해제 (Resource Cleanup)
- 스레드 풀이 종료되면, 관련 자원을 해제합니다. 이는 주로 메모리 관리와 관련된 작업입니다.
자원 관리
ExecutorService를 사용하면 자원 관리가 훨씬 쉬워집니다. 주로 다음과 같은 방식으로 자원을 관리합니다:
- 자동 스레드 관리
- ExecutorService는 내부적으로 스레드 풀을 관리하므로, 스레드 생성 및 종료의 오버헤드를 줄일 수 있습니다. 이는 자원 관리를 더 효율적으로 만듭니다.
- 작업 큐 사용
- 스레드 풀은 작업 큐를 사용하여 작업을 대기열에 넣고, 스레드가 사용 가능해질 때 작업을 실행합니다. 이는 자원의 효율적 사용을 보장합니다.
- 동기화된 자원 접근
- 여러 스레드가 동시에 공유 자원에 접근할 때, 동기화된 블록이나 메서드를 사용하여 데이터 일관성을 유지합니다.
- 예: synchronized 블록, ReentrantLock 등.
- 예외 처리
- ExecutorService를 사용하면 Future 객체를 통해 작업의 성공 여부를 확인하고 예외를 처리할 수 있습니다. 이는 스레드에서 발생하는 예외를 효과적으로 관리할 수 있게 합니다.
- 자원 해제
- 스레드 풀을 종료할 때 shutdown() 메서드를 사용하여 더 이상 새로운 작업을 받지 않도록 하고, awaitTermination()을 사용하여 모든 작업이 완료될 때까지 기다립니다. 이는 모든 자원이 적절히 해제되도록 보장합니다.
- 예: 데이터베이스 연결 해제, 파일 닫기 등.
'java' 카테고리의 다른 글
디자인패턴에서 자주 쓰이는 용어 정리(GPT)(1) (0) | 2024.07.16 |
---|---|
멀티스레딩과 비동기I/O 차이점 (0) | 2024.07.08 |
JAVA Beans 패턴 (0) | 2024.07.05 |
JAVA Servlet 주요 인터페이스 정리 (GPT ver) (0) | 2024.07.04 |
System.arraycopy vs Arrays.copyOfRange (0) | 2024.06.27 |