앞선 아티클에서 우리는 Thread 클래스로부터 작업 스레드를 선언하는 방식을 살펴보았습니다.
일단 기본적으로 Thread 클래스를 사용해서 작업 스레드 인스턴스를 생성해야 하는데, 이 때 호출하는 생성자는 인터페이스 Runnable을 파라미터로 갖습니다. Runnable이란 네이밍에서 우리는 이것이 '작업 스레드가 실행할 수 있는 코드'를 갖고 있다는 점을 유추하면 되겠습니다.
Thread thread = new Thread(Runnable target);
여기서 인터페이스 Runnable은 메서드 run( )이 선언되어 있습니다. 즉, Runnable 구현 클래스는 run( )을 오버라이드해서 작업 스레드가 실행할 실제 코드를 선언해줘야 합니다. 여기서 Runnable 구현 클래스는 작업 내용만 정의한 것이지 실제 스레드는 아닙니다.
아래와 같이 구현 클래스를 작성하고, 이를 파라미터로 해서 Thread 생성자를 호출하게 되는 것입니다.
class Task implements Runnable {
public void run() {
// 작업 스레드 실행할 코드
}
}
Runnable task = new Task();
Thread thread = new Thread(task);
자, 이렇게 작업 스레드인 thread가 선언되었습니다. 하지만, 이론적으로는 이렇게 코드를 구현할 수 있지만 실제로는 Runnable 익명 개체를 통해서 파라미터를 선언하는 경우가 대다수입니다. 위에서 Thread 생성자 호출 시 별도의 task라는 구현 객체를 선언하지 않고 직접 익명 객체를 통해서 파라미터에 작업 스레드로 실행할 코드를 선언해 보겠습니다.
Thread thread = new Thread( new Runnable() {
public void run() {
// 작업 스레드가 실행할 코드
}
});
위에서 task가 들어갔던 자리에 익명의 Runnable 구현 객체를 사용했습니다. 자, 그런데 여기서 중요한 것은 Runnable 인터페이스는 run( ) 메서드 하나만 정의된 함수적 인터페이스입니다. 그럼 무엇이 가능할까요? 바로 람다식이 사용 가능합니다.
Thread thread = new Thread( () -> {
// 작업 스레드가 실행할 코드
} );
위와 같이 작업 스레드를 선언했다고 해서, 자동으로 스레드가 실행되는 것은 아닙니다. 해당 thread의 start( ) 메서드를 사용해서 호출해야 비로소 해당 스레드가 실행되는 것이죠.
thread.start();
위와 같이 start( ) 메서드가 호출되면 작업 스레드는 파라미터로 받은 Runnable의 run( ) 메서드를 실행하면서 자신의 작업을 처리하게 됩니다.
이제까지의 스레드의 작동 순서를 살펴보면
(1) 메인 스레드에서
(2) (작업)스레드의 객체를 생성합니다.
- 이 때, 별도의 Runnable 구현 클래스를 선언하거나
- 생성자에 익명 객체로 Runnable을 선언합니다.
(3) 이렇게 생성된 스레드에서 start( ) 메서드를 호출합니다.
- 동시에 메인 스레드도 자신의 작업을 병렬로 진행합니다.
아래와 같은 예제가 있습니다. 아래 예제는 싱글 스레드를 사용하는 예제인데, 0.5초 주기로 비프(beep)음을 발생시키는 작업과 "띵~"이라는 글자를 출력하는 작업이 있다고 가정해 봅시다. 이 두가지 작업을 싱글 스레드로 아래와 같이 구현해 실행하면 어떻게 동작할까요?
import java.awt.Toolkit;
public class ExampleMain {
public static void main(String[] args) {
Toolkit toolkit = Toolkit.getDefaultToolkit();
for(int i = 0; i < 5; i++) {
toolkit.beep();
try {
Thread.sleep(500);
} catch (Exception e) {}
}
for(int i = 0; i < 5; i++) {
System.out.println("띵~");
try {
Thread.sleep(500);
} catch (Exception e) {}
}
}
}
결과적으로 이는 비프음이 먼저 5번 재생이 된 다음, 콘솔에 "띵~"이라는 글자가 5번 출력이 순차적으로 진행됩니다. 싱글 스레드에서는 이 두 작업을 동시에 실행할 수 없는 것이죠. 다음 아티클에서 이 작업을 멀티 스레드로 구현해 보겠습니다.
'Programming > JAVA' 카테고리의 다른 글
멀티 스레드(2) - 작업 스레드 개념 : Thread 하위 클래스로부터 생성 1 (0) | 2024.10.29 |
---|---|
멀티 스레드(2) - 작업 스레드 개념 : Thread 클래스로부터 생성 2 (0) | 2024.10.28 |
멀티 스레드(1) - 멀티 스레드 개념 : 프로세스와 스레드 2 (0) | 2024.10.22 |
멀티 스레드(1) - 멀티 스레드 개념 : 프로세스와 스레드 1 (0) | 2024.10.21 |
컬렉션 프레임워크(5) - 검색 강화 컬렉션 2 : TreeSet (0) | 2024.01.12 |