상세 컨텐츠

본문 제목

스레드 생성 방법 (Runnable)

기록 - 프로그래밍/Java

by wjjun 2024. 1. 29. 00:35

본문

멀티스레드

실행 중인 하나의 애플리케이션을 프로세스라고 합니다. 사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당 받아 애플리케이션을 실행하는데 이것을 프로세스 라고 합니다. 하나의 애플리케이션은 다중 프로세스를 만들기도 합니다.

 

크롬 브라우저를 두 개 실행했다면 두 개의 크롬 브라우저 프로세스가 실행된 것입니다.

 

멀티태스킹은 두 가지 이상의 작업을 동시에 처리하는 것을 의미합니다. 운영체제에서 멀티 태스킹이 가능하도록 CPU 와 메모리 자원을 프로세스마다 적절하게 할당하고 병렬로 실행시킵니다. 두 가지 이상의 작업이 가능한 이유는 멀티 스레드에 있습니다. 스레드는 사전적 의미로 한 가닥의 실이라는 뜻으로 한 가지 작업을 실행하기 위해 순차적으로 실핸할 코드를 실처럼 이은 것을 의미하는 이름입니다. 한 프로세스 내 스레드가 두 개라면 두 개의 코드 실행 흐름이 생긴다는 것을 의미합니다. 멀티 프로세스가 애플리케이션 단위의 멀티 태스킹이면 멀티 스레드는 애플리케이션 내부에서의 멀티 태스킹이라 할 수 있습니다.

 

멀티 프로세스들은 운영체제에서 할당받은 자신의 메모리를 갖고 실행하기 때문에 독립적입니다. 하지만 멀티 스레드는 하나의 프로세스 내부에서 생성되는 것으로 스레드 하나가 예외가 발생되면 프로세스가 종료될 수 있습니다.

 

메인 스레드

모든 자바 애플리케이션에는 main() 메서드를 실행하면서 시작됩니다. 메인 스레드는 필요에 따라 작업 스레드를 만들고 병렬로 코드를 실행할 수 있습니다. 멀티 스레드를 생성해서 멀티 태스킹을 수행합니다. 그리고 멀티 스레드 애플리케이션을 보면 메인 스레드가 작업 스레드 1을 생성하고 실행한 다음 이어서 스레드2를 생성하고 실행합니다. 싱글 스레드 애플리케이션은 메인 메서드가 종료되어도 작업 스레드가 실행 중이면 프로세스는 종료되지 않습니다.

 

작업 스레드 생성과 실행

멀티 스레드로 실행하는 애플리케이션을 개발하려면 몇 개의 작업을 병렬로 실행할지 결정하고 각 작업별 스레드를 생성해야 합니다. 자바 애플리케이션은 메인 스레드는 필수로 존재하므로 메인 작업 외 추가 병렬 작업의 수만큼 스레드를 생성하면 됩니다. 자바에서 작업 스레드도 객체로 생성이 되기 때문에 클래스가 필요합니다. java.lang.Thread 클래스를 직접 객체화해서 생성해도 됩니다. Thread를 상속해서 하위 클래스를 만들어서 생성할 수도 있습니다.

 

직접 Thread 생성

java.lang.Thread 클래스로부터 작업 스레드 객체를 직접 생성하려면 다음처럼 Runnable을 매개값으로 갖는 생성자를 호출해야 합니다.

Thread thread = new Thread(Runnable target);

 

Runnable 작업 스레드가 실행할 수 있는 코드를 갖고 있는 객체라고 붙여진 이름입니다. Runnable은 인터페이스 타입이기 때문에 구현 객체를 만들어서 대입해야 합니다. Runnable 에는 run() 메서드 하나가 정의되어 있습니다. 구현 클래스는 run()을 재정의해서 작업 스레드가 실행할 코드를 작성해야 합니다. 아래 코드처럼 구현 클래스를 작성해야 합니다.

class Task implements Runnable {
    public void run() {
        스레드가 실행할 코드;
    }
}

 

람다식

Runnable run = () -> {
    // 스레드가 실행할 코드 작성
    // sout("스레드 실행");
}

 

Runnable은 작업 내용을 가지고 있는 객체이지 실제 스레드는 아닙니다. Runnable 구현 객체를 생성한 후 이것을 매개값으로 해서 Thread 생성자를 호출하면 비로소 작업 스레드가 생성됩니다. 

Runnable task = new Task();
Thread thread = new Thread(task);

 

코드를 줄이게 되면 Thread 생성자를 호출할 때 Runnable 익명 객체를 매개값으로 사용할 수 있습니다.

Thread thread = new Thread(new Runnable() {
    public void run() {
        // 스레드가 실행할 코드
    }
});

 

Ruunable 인터페이스는 run() 메서드 하나만 정의되어 있어 함수적 인터페이스 입니다. 그래서 람다식을 이용해 매개값으로 사용할 수 있습니다. 자바 8부터 지원됩니다.

Thread thread = new Thread( () -> {
    // 스레드가 실행할 코드;
} );

 

작업 스레드는 생성되는 즉시 실행되는 것이 아닌 start() 메서드를 호출해야만 실행 됩니다. thread.start();

 

 

Thread 하위 클래스로부터 생성

작업 스레드가 실행할 작업을 Runnable로 만들지 않고 Thread의 하위 클래스로 작업 스레드를 정의하면서 작업 내용을 포함시킬 수도 있습니다. Thread 클래스를 상속한 후 run메서드를 재정의(overriding)해서 스레드가 실행할 코드를 작성하면 됩니다. 작업 스레드 클래스로부터 작업 스레드 객체를 생성하는 방법은 일반적인 객체를 생성하는 방법과 동일합니다.

public class WorkerThread extends Thread {
    @Override
    public void run() {
        // 스레드가 실행할 코드
    }
}

Thread thread = new WorkerThread();

 

'기록 - 프로그래밍 > Java' 카테고리의 다른 글

제네릭 정리  (0) 2024.01.31
스레드 상태제어  (1) 2024.01.30
날짜 파싱 메서드 (Formatting)  (1) 2024.01.28
Objects 클래스 설명  (0) 2024.01.26
예외처리 (Exception, RuntimeException, 사용자 정의 예외)  (1) 2024.01.22

관련글 더보기

댓글 영역