InterruptedException in Java - 스레드 중단 예외에 대한 솔루션
Java 다중 스레드 프로그래밍에서 스레드 중단 예외는 일반적인 문제이자 주의가 필요한 문제입니다. 스레드가 실행 중이고 다른 스레드가 이를 중단하려고 하면 InterruptedException이 발생합니다. 이번 글에서는 InterruptedException이 발생하는 원인과 해결 방법에 대해 설명합니다.
InterruptedException은 스레드가 중단되어 발생하는 예외입니다. 스레드가 실행되는 동안 다른 스레드가 Interrupt() 메서드를 통해 이를 중단할 수 있습니다. 중단된 스레드가 IO 작업을 기다리거나 잠금을 기다리는 등 대기 상태에 있는 경우 InterruptedException이 발생합니다.
예를 들어 아래 코드에서 스레드 t1이 Thread.sleep()을 실행할 때 스레드 t2가 이를 중단하므로 t1은 InterruptedException 예외를 발생시킵니다.
Thread t1 = new Thread(() -> { try { Thread.sleep(5000); } catch (InterruptedException e) { System.out.println("Thread interrupted"); } }); t1.start(); Thread t2 = new Thread(() -> { t1.interrupt(); }); t2.start();
스레드에서 InterruptedException이 발생하면 특정 상황에 따라 처리해야 합니다. 일반적으로 catch 블록에서 Thread.currentThread().interrupt()를 호출하여 스레드를 다시 중단하여 상위 호출자가 스레드가 중단되었음을 알 수 있도록 해야 합니다.
예를 들어 다음 코드에서는 스레드 t1이 실행을 마친 후 중단되었는지 확인하고 catch 블록에서 자체적으로 다시 중단합니다.
Thread t1 = new Thread(() -> { try { Thread.sleep(5000); System.out.println("Thread finished"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.out.println("Thread interrupted"); } }); t1.start(); Thread t2 = new Thread(() -> { t1.interrupt(); }); t2.start();
또한 스레드가 잠금 해제 또는 파일 닫기와 같이 리소스 정리가 필요한 일부 작업을 수행하는 경우 catch 블록에서도 정리 작업을 수행해야 합니다. 예를 들어 다음 코드에서는 스레드 t1이 실행을 완료한 후 리소스를 해제하고 중단되었는지 여부를 확인합니다.
Thread t1 = new Thread(() -> { Lock lock = new ReentrantLock(); lock.lock(); try { Thread.sleep(5000); System.out.println("Thread finished"); } catch (InterruptedException e) { Thread.currentThread().interrupt(); System.out.println("Thread interrupted"); } finally { lock.unlock(); } }); t1.start(); Thread t2 = new Thread(() -> { t1.interrupt(); }); t2.start();
간단히 말하면 InterruptedException 예외 처리 방법을 정의하는 것은 스레드 중단 작업을 올바르게 처리하고 코드의 복잡성을 최대한 줄이는 데 도움이 될 수 있습니다.
위 내용은 Java의 InterruptedException - 스레드 중단 예외에 대한 솔루션의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!