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에 대해서는 다음 포스트에서 공부해보겠습니다.