본문 바로가기

Programming/JAVA

멀티 스레드(1) - 멀티 스레드 개념 : 프로세스와 스레드 2

JAVA logo image

 

 

 

기본적으로 JAVA의 어플리케이션은 메인 스레드(main thread)가 main() 메서드를 실행하면서 시작됩니다. 당연하지만 main() 메서드의 코드를 순차적으로 실행해서 마지막 코드 또는 return문을 만나면 실행을 종료하게 되죠. 

 

그런데 여기서 메인 스레드가 필요에 의해서 병렬로 작업 스레드를 통해 코드를 실행할 수 있습니다. 이것이 멀티 스레드를 생성해 진행하는 멀티 태스킹입니다. 

 

 

위의 그림과 같이 메인 스레드가 메인 스레드가 작업 스레드 1을 생성하고 실행한 다음, 작업 스레드 2를 또하나 생성해 실행하는 방식이 되겠네요.

 

싱글 스레드 어플리케이션에서는 스레드는 메인 스레드 하나밖에 없습니다. 그래서 메인 스레드가 종료되면 어플리케이션 자체가 종료됩니다. 하지만 멀티 스레드는 다르죠. 메인 스레드가 먼저 종료되더라도, 작업 스레드가 계속 실행 중이라면 어플리케이션 실행이 종료되지 않는다는 특징이 있습니다. 

 

 

 


 

 

 

○ 작업 스레드 생성 방식

 

기본적으로 작업 스레드는 어플리케이션 개발 설계 시점에 몇 개의 작업을 병렬로 실행할 것인지를 결정하고, 이에 맞게 각각의 작업 별로 스레드를 생성하면 됩니다. 예를 들어 메인 스레드는 프로그램 시작, 작업 스레드 1은 네트워킹, 작업 스레드 2는 사진 필터...같은 방식으로 같은 레벨에 존재하는 것이죠. 

 

JAVA에서 작업 스레드도 하나의 객체로 생성되기 때문에 클래스가 필요합니다. java.lang.Thread 클래스를 이용하는데, 이를 직접 객체화 하여 생성하거나 Thread를 상속해서 하위 클래스를 만들어 생성하기도 합니다. 

 

 

 

○ 작업 스레드 생성(1) - 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);