1. Thread클래스를 상속
class MYThread extends Thread {
public void run() { /* 작업 내용 */ } // Thread클래스의 run()을 오버라이딩
}
2. Runnable인터페이스를 구현 (객체지향적인 방법)
class MyThread implements Runnable {
public void run() { /* 작업내용 */ } // Runnable인터페이스의 run()을 구현
}
Runnable인터페이스는 오로지 run()만 정의되어 있는 간단한 인터페이스이다.
Runnable인터페이스 구현하기 위해서 할 일은 추상메서드인 run()의 몸통{}을 만들어 주는 것 뿐.
public interface Runnable {
public abstract void run();
}
★ 쓰레드를 구현한다는 것은, 그저 쓰레드를 통해 작업하고자하는 내용으로 run()의 몸통{}을 채우는 것 뿐
class ThreadEx1 {
public static void main(String args[]) {
ThreadEx1_1 = new ThreadEx1_1();
Runnable r = new ThreadEx1_2();
Thread t2 = new Thread(r); // 생성자 Thread(Runnable target)
t1.start();
t2.start();
}
}
class ThreadEx1_1 extends Thread {
public void run() {
for(int i=0; i < 5; i++) {
System.out.println(getName());
}
}
}
class ThreadEx1_2 implements Runnable {
public void run() {
for(int i=0; i < 5; i++) {
// Thread.currentThread() - 현재 실행중인 Thread를 반환
System.out.println(Thread.currentThread().getName());
}
}
}
- run()을 호출하면 참조변수 r을 통해서 Runnable인터페이스를 구현한 인스턴스의 run()이 호출됨.
- Thread 클래스를 상속받으면, 자손 클래스에서 조상인 Thread 클래스의 메서드를 직접 호출 가능
- Runnable을 구현하면 Thread클래스의 static메서드인 currentThread()를 호출하여 쓰레드에 대한 참조를 얻어 와야만 호출 가능
▶ Runnable을 구현한 ThreadEx1_2에는 멤버라고는 run()밖에 없기 때문에 Thread클래스의 getName() 호출 하기 위해서는
'Thread.currentThread().getName()'와 같이 해야 함.
- 쓰레드의 이름을 지정하지 않으면 'Thread-번호'의 형식으로 이름이 정해짐.
쓰레드의 실행 - start()
: start()를 호출해야만 쓰레드가 실행됨.
: 바로 실행되는 것은 아니고, 일단 실행대기 상태에 있다가 자신의 차례가 되어야 실행.
★ 한 번 실행이 종료된 쓰레드는 다시 실행할 수 없다 → 하나의 쓰레드에 대해 start()가 한 번만 호출될 수 있음.
※ 한 번 더 수행해야 한다면 새로운 쓰레드를 생성한 다음에 start()를 호출해야 함.
'Language > java' 카테고리의 다른 글
[Java] synchronized 동기화 정리 (0) | 2023.03.12 |
---|---|
[Java] 쓰레드_start()와 run() (0) | 2022.08.02 |
[Java] 쓰레드_프로세스와 쓰레드 (0) | 2022.08.02 |
[Java] 애너테이션_애너테이션 타입 정의하기 (0) | 2022.08.02 |
[Java] 애너테이션_메타 애너테이션 (0) | 2022.08.02 |
댓글