Java

[Java] Thread와 Runnable의 개념 및 사용법

하부루 2024. 11. 28. 22:23

Thread 클래스

  • Thread는 자바에서 멀티스레드를 지원하기 위해 제공되는 클래스이다.
  • Thread 클래스를 상속받아서 스레드가 실행할 작업을 정의한다

 

Thread 클래스의 주요 메서드

  • start()
    • 새로운 스레드를 생성하고, 내부적으로 run() 메서드를 호출
  • run()
    • 스레드가 실행할 작업을 정의
  • sleep()
    • 현재 스레드를 지정된 시간 동안 대기상태로 만든다
  • join()
    • 현재 스레드가 종료될 때까지 다른 스레드가 대기하게 만든다
public class ThreadExample extends Thread {
    @Override
    public void run() {
        // 스레드에서 실행할 작업
        for (int i = 1; i <= 5; i++) {
            System.out.println(getName() + " - " + i);
            try {
                Thread.sleep(500); // 0.5초 대기
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        ThreadExample thread1 = new ThreadExample();
        ThreadExample thread2 = new ThreadExample();

        thread1.start(); // 스레드 시작
        thread2.start();
    }
}

== 결과 ==
Thread-0 - 1
Thread-1 - 1
Thread-0 - 2
Thread-1 - 2

 

Runnable 인터페이스

  • Runnable 인터페이스는 Thread와 분리된 방식으로 스레드 작업을 정의하기 위한 인터페이스이다
  • Runnable을 구현한 객체를 Thread 클래스에 전달하여 실행한다
  • run() 메소드를 구현하여 스레드의 작업을 정의한다.
public class RunnableExample implements Runnable {
    @Override
    public void run() {
        // 스레드에서 실행할 작업
        for (int i = 1; i <= 5; i++) {
            System.out.println(Thread.currentThread().getName() + " - " + i);
            try {
                Thread.sleep(500); // 0.5초 대기
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }

    public static void main(String[] args) {
        RunnableExample task = new RunnableExample();
        Thread thread1 = new Thread(task);
        Thread thread2 = new Thread(task);

        thread1.start(); // 스레드 시작
        thread2.start();
    }
}

== 결과 ==
Thread-0 - 1
Thread-1 - 1
Thread-0 - 2
Thread-1 - 2

 

Thread와 Runnable의 한계점

1. 반환값을 지원하지 않는다.

  • run() 메서드는 반환값을 제공하지 않아서 코드가 복잡해 질 수 있다.

2. 예외 처리의 한계

  • run() 메서드에서는 예외를 반환하거나 호출자에게 전달할 수 없다.

 

일반적으로 이를 해결하기 위해서 자바5부터 제공하는 Executor, ExecutorService를 사용한다.

Executor, ExecutorService에 대해서는 다음 포스트에서 공부해보겠습니다.