4. 스레드의 실행
생성한 스레드 객체를 실행하기 위해서는 Thread 타입이 제공하는 start() 메서드를 호출하면 됨
스레드를 실행하는 방법은 스레드 생성 방법에 관계 없이 동일하게
start()를 호출하여 실행시킬 수 있음
1. java.lang.Thread를 통한 스레드 실행 방법
Thread 클래스를 상속받은 자식 클래스인 FirstThread를 통해
Thread 클래스가 제공하는 start()를 호출하여 스레드를 실행시킬 수 있음
public class Main {
public static void main(String[] args) {
FirstThread thread = new FirstThread();
thread.start(); // 2. start()를 호출하여 스레드 실행
}
}class FirstThread extends Thread {
public void run() {
System.out.println("FirstThread 실행 중.."); // 1. 스레드가 처리할 작업 작성
}
}2. Runnable 인터페이스를 통한 스레드 실행 방법
Runnable 인터페이스를 구현한 FirstThread 구현체를 Thread 생성자의 인스턴스로 전달하였기 때문에,
생성된 Thread 타입의 인스턴스인 thread 참조 변수를 통해 start()를 호출하여 스레드를 실행할 수 있음
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new FirstThread());
thread.start(); // 2. start()를 호출하여 스레드 실행
}
}class FirstThread implements Runnable {
public void run() {
System.out.println("FirstThread 실행 중.."); // 1. 스레드가 처리할 작업 작성
}
}3. 실제 실행되는 메서드는 run()
개발자가 start()를 호출하면 JVM은 해당 스레드의 run()를 호출하여 스레드를 실행시킴
start()를 호출하면 내부적으로 native 메서드인 start0()가 호출되면서 OS 자체 스레드인 커널 스레드를 생성하여 자바 스레드 객체와 맵핑하는 등의 OS 레벨에서의 처리가 수행됨
만약 다음과 같이 개발자가 run()를 직접 호출하게 될 경우, 아래의 문제들이 발생함
-
프로그램의 동작에 있어서 해당 작업이 스레드를 통해 호출되는 것이 아닌, 단순한 메서드 호출이 되어버리기 때문에 동시/병렬적인 처리가 불가능해짐
-
해당 작업은 개별 스레드에서 실행되는 것이 아닌,
main()를 호출, 동작시키는 메인 스레드에서 실행됨 → 단순한 동기적인 실행으로 되어버림
public class Main {
public static void main(String[] args) {
Thread thread = new Thread(new FirstThread());
// thread.start(); // 스레드 실행
thread.run(); // run()를 직접 호출, FirstThread가 아닌 Main 스레드에서 실행됨
}
}class FirstThread implements Runnable {
public void run() {
System.out.println("FirstThread 실행 중.."); // 1. 스레드가 처리할 작업 작성
}
}따라서 작성한 프로그램이 멀티 스레드로 동작하도록 하기 위해서는 run()를 직접 호출하면 안되고, start()를 통해 호출시켜야 함