Computer >> 컴퓨터 >  >> 프로그래밍 >> Java

자바에서 Runnable 인터페이스를 구현하지 않고 스레드를 생성하는 방법

스레드(Thread)는 경량 프로세스(lightweight process)라고 부를 수 있습니다. 자바는 멀티스레딩(Multithreading)을 지원하기 때문에 하나의 애플리케이션에서 두 개 이상의 작업을 동시에(concurrently) 수행할 수 있습니다.

모든 자바 프로그램에는 최소한 하나의 스레드가 존재하며, 이를 메인 스레드(main thread)라고 합니다. 메인 스레드는 프로그램이 시작되어 main() 메서드가 호출되는 시점에 JVM(Java Virtual Machine)이 자동으로 생성합니다.

일반적으로 자바에서 스레드를 생성하는 방법은 두 가지입니다.

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

그런데 별도의 클래스에서 Runnable 인터페이스를 명시적으로 구현하지 않고도, 익명 내부 클래스(anonymous inner class)를 활용하면 스레드를 손쉽게 생성할 수 있습니다. 아래 예제를 통해 확인해 보겠습니다.

예제 코드

public class CreateThreadWithoutImplementRunnable { // implements Runnable 없이 스레드 생성
    public static void main(String[] args) {
        new Thread(new Runnable() {
            public void run() {
                for (int i = 0; i <= 5; i++) {
                    System.out.println("Runnable의 run() 메서드: " + i);
                }
            }
        }).start();
        for (int j = 0; j <= 5; j++) {
            System.out.println("main() 메서드: " + j);
        }
    }
}

실행 결과

main() 메서드: 0
Runnable의 run() 메서드: 0
main() 메서드: 1
Runnable의 run() 메서드: 1
main() 메서드: 2
Runnable의 run() 메서드: 2
main() 메서드: 3
Runnable의 run() 메서드: 3
main() 메서드: 4
Runnable의 run() 메서드: 4
main() 메서드: 5
Runnable의 run() 메서드: 5

코드 설명

위 예제에서는 new Thread(new Runnable() {...}) 형태로 익명 내부 클래스를 사용했습니다. 별도의 클래스 파일을 만들어 implements Runnable을 선언하는 대신, Thread 객체를 생성하는 자리에서 곧바로 Runnable의 run() 메서드를 오버라이드한 것입니다.

출력 결과를 보면 main() 메서드와 run() 메서드의 출력이 번갈아 나타나는데, 이는 메인 스레드와 새로 생성된 스레드가 동시에 실행되고 있음을 보여줍니다. 단, 스레드 스케줄링은 JVM과 운영체제에 따라 달라질 수 있으므로 실행 순서는 매번 다르게 나타날 수 있습니다.

참고: 람다 표현식으로 더 간결하게 작성하기

자바 8(Java 8) 이상에서는 Runnable이 함수형 인터페이스이므로 람다 표현식(lambda expression)을 사용하면 코드를 훨씬 간결하게 만들 수 있습니다.

public static void main(String[] args) {
    new Thread(() -> {
        for (int i = 0; i <= 5; i++) {
            System.out.println("람다로 실행한 run(): " + i);
        }
    }).start();
}

이처럼 익명 내부 클래스나 람다 표현식을 활용하면 Runnable 인터페이스를 명시적으로 구현하는 별도의 클래스 없이도 간편하게 스레드를 생성하고 실행할 수 있습니다.