본문 바로가기

JAVA/EXCEPTION

InterruptedException 발생원인과 해결방법

`InterruptedException`은 Java에서 스레드가 대기 상태에 있거나 작업을 수행하고 있을 때 다른 스레드에 의해 인터럽트가 발생했을 때 발생하는 예외입니다. 다른 스레드에서 `Thread.interrupt()` 메서드를 호출하여 해당 스레드의 인터럽트 상태를 설정하면, `InterruptedException`이 발생하게 됩니다.

**발생 원인:**
`InterruptedException`은 주로 다음과 같은 상황에서 발생합니다:

1. **`Thread.sleep()` 등 대기 중인 스레드를 다른 스레드가 인터럽트한 경우**: 다른 스레드가 `interrupt()` 메서드를 호출하여 대기 중인 스레드의 블록을 해제하고 `InterruptedException`을 발생시킵니다.

   ```java
   try {
       Thread.sleep(1000); // 다른 스레드에 의해 인터럽트될 수 있음
   } catch (InterruptedException e) {
       // InterruptedException 처리
   }
   ```

2. **`Object.wait()` 또는 `Thread.join()` 등 대기 중인 스레드를 다른 스레드가 인터럽트한 경우**: 다른 스레드가 인터럽트하여 대기 중인 스레드의 블록을 해제하고 `InterruptedException`을 발생시킵니다.

   ```java
   Object lock = new Object();
   synchronized (lock) {
       try {
           lock.wait(); // 다른 스레드에 의해 인터럽트될 수 있음
       } catch (InterruptedException e) {
           // InterruptedException 처리
       }
   }
   ```

**해결 방법:**
`InterruptedException`은 스레드가 인터럽트되어 중단될 수 있는 상황에 대한 처리를 제공합니다. 이 예외를 처리하고 대응하는 방법은 다음과 같습니다:

1. **`InterruptedException`을 적절히 처리**: `InterruptedException`은 스레드의 인터럽트 상태를 확인하고 해당 처리를 수행하는 것이 중요합니다. 대기 중인 스레드의 작업을 취소하거나 정리하는 등의 작업을 수행할 수 있습니다.

   ```java
   try {
       Thread.sleep(1000);
   } catch (InterruptedException e) {
       // 스레드의 인터럽트 상태를 확인하고 처리
       Thread.currentThread().interrupt(); // 인터럽트 상태를 재설정
       // 추가적인 처리를 수행 (예: 작업 취소, 정리 등)
   }
   ```

2. **`InterruptedException`을 무시하고 진행할 경우**: 인터럽트를 무시하고 작업을 계속하는 경우, 예외를 잡은 후 아무 작업을 하지 않거나 로깅하는 등의 처리를 수행할 수 있습니다.

   ```java
   try {
       Thread.sleep(1000);
   } catch (InterruptedException e) {
       // 인터럽트를 무시하고 아무 작업도 수행하지 않음
       // 또는 로깅 등의 처리
   }
   ```

`InterruptedException`은 스레드의 인터럽트 상태에 따른 적절한 대응과 처리를 제공하여 스레드 간 상호작용에 대한 안정성을 높일 수 있습니다. 따라서 스레드 작업 중 인터럽트에 대한 적절한 예외 처리를 수행하는 것이 중요합니다.