// Thread 상속
public class HelloThread extends Thread {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": run()");
}
}
// Runnable 인터페이스 구현
public class HelloRunnable implements Runnable {
@Override
public void run() {
System.out.println(Thread.currentThread().getName() + ": run()");
}
}
// start()로 실행
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
클래스를 상속받아 run()
메서드만 재정의하면 된다.Thread
클래스를 상속받을 수 없다.Runnable
인터페이스 방식은 다른 클래스를 상속받아도 문제없이 구현할 수 있다.Runnable
객체를 공유할 수 있어 자원 관리를 효율적으로 할 수 있다.Runnable
객체를 생성하고 이를 Thread
에 전달하는 과정이 추가된다.
i) 정적 중첩 클래스 사용
public class InnerRunnableMainV1 {
public static void main(String[] args) {
log("main() start");
Runnable runnable = new MyRunnable();
Thread thread = new Thread(runnable);
thread.start();
log("main() end");
}
static class **MyRunnable** implements Runnable {
@Override
public void run() {
log("run()");
}
}
}
ii) 익명 클래스 사용
iii) 람다 사용
public class InnerRunnableMainV4 {
public static void main(String[] args) {
log("main() start");
Thread thread = new Thread(() -> log("run()"));
thread.start();
log("main() end");
}
}