본문 바로가기
Language/java

[Java] 쓰레드_쓰레드의 구현과 실행

by gamxong 2022. 8. 2.

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()를 호출해야 함.

 

 

댓글