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

2022. 6. 28. 18:22JAVA/Language

1. 쓰레드를 구현하는 방법

  • Thread 클래스를 상속하는 방법
  • Runnable 인터페이스를 구현하는 방법

1.1 Thread 클래스를 상속하는 방법

class MyThread extends Thread{
	public void run(){ // Thread 클래스의 run()을 오버라이딩
    	...
    }
}
MyThread t1 = new MyThread();
t1.start();

 

1.2 Runnable 인터페이스를 구현하는 방법

class MyThread implements Runnable{
	public void run(){ // Runnable 인터페이스의 run()을 구현
    	...
    }
}
Thread t1 = new Thread(new MyThread());
t1.start();

 

2. 현재 실행중인 쓰레드의 참조

static Thread currentThread() : 현재 실행중인 쓰레드의 참조를 반환함
String getName()              : 쓰레드의 이름을 반환함

 

다음 예제는 currentThread(), getName()을 호출하여 현재 실행중인 쓰레드의 이름을 출력하는 예제입니다.

public class MyThread1 extends Thread{

	@Override
	public void run() {
		IntStream.range(0, 5).forEach(i->{
			System.out.println(getName());	// 조상인 Thread의 getName() 호출
		});
	}

	
}
public class MyThread2 implements Runnable{

	@Override
	public void run() {
		IntStream.range(0, 5).forEach(i->{
			// Thread.currentThread() - 현재 실행중인 Thread 반환
			System.out.println(Thread.currentThread().getName());
		});
	}

}
public class Driver {

	public static void main(String[] args) {
		MyThread1 t1 = new MyThread1();
		
		Runnable r = new MyThread2();
		Thread t2 = new Thread(r);
		
		t1.start();
		t2.start();
	}

}
실행결과
Thread-0
Thread-0
Thread-0
Thread-0
Thread-0
Thread-1
Thread-1
Thread-1
Thread-1
Thread-1

 

3. 쓰레드의 실행 - start()

쓰레드 인스턴스를 생성하였다면 start() 메서드를 호출하여 실행시킬 수 있습니다.

t1.start(); // 쓰레드 t1을 실행
t2.start(); // 쓰레드 t2을 실행
  • 쓰레드의 start()가 호출되었다고 해서 바로 실행되지 않습니다. 대기 상태에 있다가 자신의 차례가 되어서 실행됩니다.
  • 한번 실행이 종료된 쓰레드는 다시 실행할 수 없습니다. 즉, 하나의 쓰레드에 대해 start()가 한번만 호출할 수 있습니다.
  • 쓰레드의 작업을 더 수행해야 한다면 쓰레드의 인스턴스를 새로 생성한 다음에 start()를 호출해야 합니다.

 

References

source code : https://github.com/yonghwankim-dev/java_study/tree/main/ch13
[도서] Java의 정석, 남궁 성 지음