Java & Spring Boot

[Java] Thread와 Runnable 활용 및 예외 처리

Accept 2024. 11. 24. 01:45

Thread 클래스와 Runnable 인터페이스

  • Thread 클래스
    • Runnable 인터페이스를 구현하고 있으며, 스레드 실행 흐름 제어 및 관련 메서드 제공
    • 주요 메서드
      • 스레드 시작 (start())
      • 스레드 일시 중지 (sleep())
      • 스레드 종료 (interrupt())
      • 스레드 이름 설정 (setName())
      • 스레드 우선순위 관리 (setPriority())
  • Runnable 인터페이스
    • 스레드에서 실행할 작업을 정의하기 위한 인터페이스
    • 단 하나의 메서드인 run() 포함

 

스레드 생성 예제

Java에서 스레드 생성 후 .start() 실행 시, JVM이 새 스레드를 생성해 운영체제에게 전달한다.

아래 예제 코드에서 스레드 생성, 이름/우선순위 설정, 병렬 실행 확인을 위한 테스트를 진행했다.

package thread.creation.example;

public class Main {

    public static void main(String[] args) throws InterruptedException {
        Thread thread = new Thread(() -> { // 스레드 생성 및 실행할 코드 정의
            System.out.println("We are now in thread " + Thread.currentThread().getName());
            System.out.println("Current thread priority is " + Thread.currentThread().getPriority());
        });

        // 스레드 이름 설정
        thread.setName("New Worker Thread");

        // 스레드 우선순위 설정 (10 : 최우선)
        thread.setPriority(Thread.MAX_PRIORITY);

        // 신규 스레드 실행 전 메인 스레드에서 실행 중인 스레드 정보 출력
        System.out.println("We are in thread: " + Thread.currentThread().getName() + " before starting a new thread");

        // 새 스레드 시작
        thread.start();

        // 신규 스레드 실행 후 메인 스레드에서 실행 중인 스레드 정보 출력
        System.out.println("We are in thread: " + Thread.currentThread().getName() + " after starting a new thread");

        // 메인 스레드 10초 대기
        Thread.sleep(10000);

        /*
        * 실행 결과(Console)
        * We are in thread: main before starting a new thread
        * We are in thread: main after starting a new thread
        * We are now in thread New Worker Thread
        * Current thread priority is 10
         */
    }
}

 

 

스레드 예외 처리

스레드에서는 스레드와 관련된 예외를 감지하지 못할 경우, Uncaught Exception Handler를 사용해 스레드 내부 예외를 효율적으로 처리할 수 있다.

package thread.exception.example;

public class Main {

    public static void main(String[] args) {
        Thread thread = new Thread(() -> { // 스레드 생성 및 실행할 코드 정의
            throw new RuntimeException("Intentional Exception");
        });

        // 스레드 이름 설정
        thread.setName("Misbehaving thread");

        // 스레드에서 발생한 예외를 처리하기 위한 핸들러 설정
        thread.setUncaughtExceptionHandler((t, e) -> System.out.println("A Critical error happened in thread " + t.getName() + " the error is " + e.getMessage()));

        // 스레드 시작
        thread.start();

        /*
        * 실행 결과(Console)
        * A Critical error happened in thread Misbehaving thread the error is Intentional Exception
         */
    }
}