Java/Thread

[Java] 멀티 스레드(Multi Thread) (1) : 멀티 스레드 생성과 실행

아, 그래요? 2021. 12. 1. 15:11
멀티 태스킹의 세계

우리는 컴퓨터로 동영상을 보면서 카톡을 보내고, 동시에 어플리케이션을 다운받는다. 이런것이 가능한 이유는 무엇일까? 바로 우리의 컴퓨터가 멀티 태스킹 기능을 제공하기 때문이다. 멀티 태스킹은 말 그대로 동시에 여러 작업을 실행하는 것을 말한다. 멀티 태스킹은 단순히 사용자의 편의성뿐만 아니라 컴퓨터의 공용자원을 더욱 효율적으로 사용할 수 있게 만들어준다.

 

  멀티태스킹(multitasking) 또는 다중작업은 다수의 작업(혹은 프로세스)이 중앙 처리 장치(이하 CPU)와 같은 공용자원을 나누어 사용하는 것을 말한다.  - 위키백과

 

 

 

어플리케이션 내부의 멀티태스킹

한 컴퓨터에서 동시에 여러 프로세스가 실행된다면, 마찬가지로 하나의 어플리케이션 내부에서 여러가지의 작업이 동시에 실행될 순 없을까? 당연히 가능하다. 실제로 우리는 카카오톡을 사용할때 채팅을 하면서 사진 파일을 보내고, 태그검색을 한다. 이렇듯 하나의 어플리케이션 내부에서도 여러 작업이 동시에 일어난다. 이때 어플리케이션 내의 작업 단위를 스레드(Thread)라고 한다. 또한 여러 쓰레드가 한 CPU에 의해 공용자원을 나눠 동시에 실행되는 것을 멀티 스레드(Multi Thread)라고 한다. 지금부터 자바에서 제공하는 멀티 스레드(Mulit Thread)기능을 살펴보자.

 

 메인스레드와 작업스레드

자바 어플리케이션은 실행을 하게 되면 main 메소드가 가장 먼저 실행된다. 이때 이 main method를 통해 순차적으로 실행되는 코드를 메인스레드라고 한다. 메인스레드는 작업스레드를 생성하고 실행시킬 수 있다. 이때 실행된 작업 스레드는 병렬적으로 실행된다.

 

멀티 스레드 어플리케이션 모식도

스레드(Thread)의 생성과 실행

스레드를 생성하는 방법은 크게 두가지다

   1) Thread 클래스를 통해 직접 생성

   2) Thread 클래스의 하위 클래스를 정의하여 생성

 

1) Thread 클래스로 부터 생성

java.lang.Thread 클래스로 부터 스레드를 생성하기 위해서는 Thread 클래스의 생성자를 호출해야 한다. 이때 이 생성자는 Runnable 인터페이스의 구현 객체를 매개변수를 갖는다. 먼저 코드로 살펴보자.

public class CreateThreadExample() {
	public static void main(String[] args) {
    	Thread thread = new Thread(new Runnable() {
        	public void run() {
            	// 실행할 내용
            }
        });
        
        //스레드 실행
        thread.start();
    }
}

Runnable은 run() 메소드를 유일하게 추상메소드로 갖는 인터페이스다. 위의 코드에서는 Runnable의 익명구현객체를 Thread 생성자의 매개변수로 넣어주었다. 물론 익명구현객체를 쓰지 않고, 구현클래스를 정의하고 객체를 생성하여 매개변수에 넣어주어도 된다.

public class CreateThreadExample2() {
	public static void main(String[] args) {
    	Runnable task = new Task();	// Task는 외부에서 정의한 Runnable의 구현 클래스
        Thread thread = new Thread(task);
    }
}

 

2) Thread 클래스의 하위 클래스를 통해 생성

Thread 클래스를 상속하는 하위 클래스를 정의하여 생성할 수 있다. 이때 부모클래스의 Thread의 run() 메소드를 재정의(Override)하여 실행할 코드를 작성한다. 예시 코드를 보자.

public class Thread1 extends Thread {
    @Override
    public void run() {
    	// 실행할 내용
    }
}
public class CreateThreadExample3() {
	public static void main(String[] args) {
    	Thread thread = new Thread1();	// promotion
        thread.start();
    }
}

정의한 하위클래스를 Thread 객체로 선언하면 프로모션(Promotion)을 통해 자동으로 Thread 객체가 생성된다.

 

각 예시코드마다 마지막에 넣어준것처럼 선언된 스레드의 start() 메소드를 호출해주면 thread가 실행된다.

Thread thread = new Thread(task);
thread.start();

 

자바의 멀티스레드 기능을 직관적으로 설명하다보니 멀티태스킹이 여러 작업이 '동시에' 실행된다고 했지만 정확히는 잘못된 표현이다. '스케줄링'이라는 방식을 통해 다중의 연산을 '번갈아 가면서' 수행한다고 보는게 훨씬 정확하다.

 

<혹시 잘못되거나 개선해야할 내용이 있다면 댓글을 통해 알려주세요. 건전한 비판과 참견은 언제나 환영입니다^^>