* 본 게시물은 이지스퍼블리싱 [Do it! 점프 투 자바] 서평단 미션 수행 및 학습 목적으로 작성하였습니다.
모든 내용, 디자인, 이미지, 편집 구성의 저작권은 이지스퍼블리싱(주)와 지은이에게 있으며
학습 목적으로 내용을 재구성하여 작성했음을 밝힙니다. 문제시 삭제하도록 하겠습니다.
[Do it! 점프 투 자바] 07.자바 심화학습 (스레드 구현 및 실행 메서드 start(), run(), join())
* 본 게시물은 이지스퍼블리싱 [Do it! 점프 투 자바] 서평단 미션 수행 및 학습 목적으로 작성하였습니다. 모든 내용, 디자인, 이미지, 편집 구성의 저작권은 이지스퍼블리싱(주)와 지은이에게 있
3mmmeee.tistory.com
Runnable
public class Sample extends Thread {} // Thread 클래스 상속 예제는 이전 게시물 참고
public class Sample implements Runnable {}
Thread 객체를 만들 때 Thread 클래스를 상속하여 만들기도 하지만,
주로 Runnable 인터페이스를 사용한다.
그 이유는 Thread 클래스를 상속하면 Thread 클래스를 상속한 클래스가 다른 클래스를 상속할 수 없기 때문이다.
Java에서는 단일 상속만 허용하기 때문에 여러 클래스를 동시에 상속할 수 없는 없지만,
여러 개의 인터페이스를 사용해 다중 상속과 유사한 기능을 구현할 수 있다.
// Runnable 인터페이스를 구현한 MyRunnable 클래스 정의
public class MyRunnable implements Runnable {
// run 메서드를 오버라이드하여 스레드가 실행할 작업을 정의
@Override
public void run() {
for (int i = 1; i <= 5; i++) {
System.out.println("Count: " + i); // 현재 숫자 출력
try {
Thread.sleep(1000); // 1초 대기
} catch (InterruptedException e) {
e.printStackTrace(); // 예외 발생 시 에러 로그 출력
}
}
}
// main 메서드로 프로그램 시작
public static void main(String[] args) {
// Runnable 객체 생성
MyRunnable myRunnable = new MyRunnable();
// Runnable 객체를 이용하여 쓰레드 생성
Thread thread = new Thread(myRunnable);
// 스레드 시작
thread.start();
}
}
각 숫자는 1초 간격으로 출력된다.
MyRunnable 클래스의 run() 메서드에서 i <= 5; 1에서 5까지의 숫자를 출력하고
Thread.sleep(1000); 1초씩 대기하는 작업을 수행하다가
Count: 5 가 출력된 후 스레드가 종료된다.
번외로, Runnable 인터페이스는 run 메서드를 구현하도록 강제한다.
문구가 교재에 적혀 있었는데 처음에는 'run() 메서드가 없어도 된다는 말이구나' 라며 전혀 다르게 이해했다.
run() 메서드는 스레드가 실행될 때 실제로 수행되는 코드를 포함하고 있어야 하는데
"강제한다." 표현은 다음과 같은 의미를 가진다.
- Runnable 인터페이스를 구현하는 클래스는 run 메서드를 반드시 오버라이드(구현)해야 한다.
(run 메서드를 정의하지 않으면 컴파일 오류가 발생한다.) - 스레드를 생성할 때, 이 Runnable 인터페이스를 구현한 객체를 생성하고 해당 객체를 스레드에 넘겨주어야 한다.
그리고 스레드가 시작되면 해당 객체의 run() 메서드가 실행된다.
public class MyRunnable implements Runnable {
@Override
public void run() {
// 스레드가 실행할 작업을 정의
System.out.println("스레드 실행 중");
}
public static void main(String[] args) {
MyRunnable myRunnable = new MyRunnable(); // Runnable 객체 생성
Thread thread = new Thread(myRunnable); // Runnable 객체를 이용하여 스레드 생성
thread.start(); // 스레드 실행
}
}
이런 식으로 run() 메서드를 구현한 클래스를 만들어 스레드가 실행할 작업을 정의하고
해당 클래스의 인스턴스를 스레드에 전달하여 스레드를 실행하는 것을
Runnable 인터페이스가 run() 메서드를 구현하도록 강제한다고 한다.