전에 스레드를 생성하기 위해 Thread 클래스를 상송받는 방법과 Runnable 인터페이스를 구현하는 방법이 있다고 했는데 드디어 Runnable 인터페이스를 구현하는 방식으로 스레드를 생성해보려고 한다.
(Runnable 인터페이스를 구현하는 방식이 실무와 조금 더 가깝다.)
Runnable 인터페이스는 java가 제공하는 스레드 실행용 인터페이스다!
public class HelloRunnable implements Runnable{
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": run()");
}
}
public class HelloRunnableMain {
public static void main(String[] args) {
System.out.println(Thread.currentThread().getName() + ": main() start");
HelloRunnable runnable = new HelloRunnable();
Thread thread = new Thread(runnable);
thread.start();
System.out.println(Thread.currentThread().getName() + ": main() end");
}
}
Thread를 상속해서 구현한 스레드처럼 Thread-0
에서 따로 run()
이 실행된 것을 볼 수 있다.
main: main() start
main: main() end
Thread-0: run()
실행 결과는 기존과 같은데, 차이가 있다면 스레드와 해당 스레드가 실행할 작업이 서로 분리되어 있다는 점이다.
스레드 객체를 생성할 때, 실행할 작업을 생성자로 전달하면 된다.
Thread
클래스를 상속받아 run()
메서드만 재정의 하면 됨Thread
클래스 상속이 불가능함Runnable
인터페이스 방식은 다른 클래스를 상속받아도 문제없이 구현 가능Runnable
객체를 공유할 수 있어 자원 관리를 효율적으로 할 수 있다.Runnable
객체를 생성하고 이를 Thread
에 전달하는 과정이 추가되기 때문!Runnable을 방식을 사용해야하는 이유는 위에 장단점으로도 명확하기도 하지만,
일단 스레드와 실행할 작업을 명확히 분리하고, 더 유연하고 유지보수 하기 쉬운 코드를 만들 수 있다는 점에서라도 Runnable을 사용하는게 좋다.