implements Runnable / extends Thread
run()
: 쓰레드 수행시 동작하는 메소드start()
: 쓰레드를 시작하는 메소드public class RunnableSample implements Runnable {
@Override
public void run() {
System.out.println("This is RunnableSample's run() method.");
}
}
public class ThreadSample extends Thread {
public void run() {
System.out.println("This is ThreadSample's run() method");
}
}
public class RunThreads {
public static void main(String[] args) {
RunThreads runThreads = new RunThreads();
runThreads.runBasic();
}
public void runBasic() {
RunnableSample runnableSample = new RunnableSample();
new Thread(runnableSample).start();
ThreadSample threadSample = new ThreadSample();
threadSample.start();
System.out.println("RunThreads.runBasic() method is ended.");
}
}
Runnable 인터페이스를 구현한 RunnableSample 클래스의 쓰레드로 바로 실행 할 수는 없다. 따라서, 이와 같이 Thread 클래스의 생성자에 해당 객체를 추가하여 시작해 주어야 한다.
Runnable interface를 구현했는지, Thread class를 상속받았는지에 따라서 사용 방법이 다음의 두가지 방법이 상이함.
RunnableSample runnableSample = new RunnableSample();
new Thread(runnableSample).start();
ThreadSample threadSample = new ThreadSample();
threadSample.start();
자바에서는 하나의 클래스만 확장할 수 있다. (extends
)
만약 어떤 클래스가 다른 클래스를 extends
를 사용해 확장해야 하는데, 쓰레드로 구현해야 한다. 하지만 그 부모 클래스는 Thread
를 확장하지 않았다면, Runnable
인터페이스를 구현하는 방법을 사용한다.
start()
메소드를 통해 쓰레드가 시작되면, 프로세스가 아닌 JVM에 하나의 쓰레드를 추가하여 실행하는 것이다.
위 runBasic()
쓰레드를 기동시키는 메소드에서 runnableSample
이라는 객체를 Thread
클래스의 start()
메소드로 시작한다.
이때 시작한 start()
메소드가 끝날 때까지 기다리지 않고, 다음 줄의 threadSample
객체의 start()
메소드가 실행된다.