본문 바로가기

Java

쓰레드 - 1. 쓰레드란?

목차

  1. 쓰레드란?
  2. 쓰레드의 생성
  3. 쓰레드의 독립성

 

 

1. 쓰레드란?


쓰레드란 실행 중인 프로그램 내에서 '또 다른 실행의 흐름을 형성하는 주체' 입니다.

 

과거, 멀티 쓰레드는 경험 있는 프로그래머들이 구사하는 고급 기술이었다고 합니다. 그러나 자바의 쓰레드 지원을 시작으로 그런 경계를 허무는 계기가 되었다고 합니다. 언어 차원에서 쓰레드를 지원한다는 것은 당시에는 놀라운 일이었다고 합니다. 쓰레드는 자바5부터 8까지 계속된 쓰레드 라이브러리 개선으로 자바를 사용하는 사람들이 손 쉽게 사용할 수 있도록 만들었주었다고 합니다. 그럼 이제 쓰레드의 생성

 

 

2. 쓰레드 생성


2022 - 07 - 10 (수정 시작)

쓰레드는 생성하는 방법은 두 가지 입니다.

  1. Thread 클래스 상속
  2. Runnable 인터페이스 구현

아래 방법은 2번으로 쓰레드를 생성하는 방법을 설명해놓았습니다.

2022 - 07 - 10 (수정 완료)

 

쓰레드 생성을 위해서는 두 가지를 구현해야 합니다.

  • 쓰레드에 할당할 일
  • 쓰레드

 

1. Runnable Interface(쓰레드에 할당할 일)

Runnable task = new Runnable() {
    @Override
    public void run() {
        String name = Thread.currentThread().getName();
        System.out.println(name + ": Hello World ");
    }
};

 

2. 쓰레드

Thread myThread = new Thread(task);

 

이후 생성된 쓰레드를 실행하기 위해서는 start() 매소드 사용하면 됩니다,

 

myThread.start();

 

프로그램이 종료되기 위해서는 모든 쓰레드가 일을 마치고 소멸된 이후 프로그램이 종료된다.그래서 생성된 쓰레드는 자신의 일을 마칠 충분한 시간을 갖는다고 합니다.

 

참고로 위와 같이 생성된 쓰레드는 자신의 일을 마치면 자동으로 소멸됩니다. 여기서 말하는 쓰레드의 소멸은 쓰레드 생성을 위해 할당했던 모든 자원의 해제입니다.

 

2. 쓰레드의 독립성


 

앞서 쓰레드를 정의할 때 '또 다른 실행의 흐름을 형성하는 주체' 라고 했습니다. 쓰레드는 독립적으로 자신의 일을 실행해나갑니다.

 

public static void main(String[] args) {
    Runnable task1 = () -> {
        for (int i = 0; i < 20; i++) {
            if (i % 2 == 0)
                System.out.println(i + " ");
        }
    };

    Runnable task2 = () -> {
        for (int i = 0; i < 20; i++) {
            if (i % 2 == 1)
                System.out.println(i + " ");
        }
    };

    Thread t1 = new Thread(task1);
    Thread t2 = new Thread(task2);
    
    t1.start();
    t2.start();
}

 

위 예는 t1 쓰레드는 짝수를 t2 쓰레드는 홀수를 출력하는 코드입니다. 이 소스 코드를 3번 실행해보겠습니다.

 

OUTPUT

1 0 3 2 5 4 7 6 9 8 11 10 13 12 15 14 17 16 19 18
0 2 4 6 1 8 10 3 12 5 14 7 16 18 9 11 13 15 17 19
1 0 2 4 6 8 10 12 14 16 18 3 5 7 9 11 13 15 17 19

우리는 어쩌면 0 1 2 3 4 5 6 7 8 9 10 ... 이런식의 오름차순으로 출력되는 홀수 , 짝수를 기대했을 수도 있습니다.

 

하지만 쓰레드 각각은 독립적으로 일을 수행합니다. 그렇기 때문에 서로의 일을 신경쓰지 않습니다. 오로지 자신의 일만을 수행합니다. 또한 쓰레드가 처한 상황, OS 코어를 쓰레드에 할당하는 방식에 따른 쓰레드 실행 속도의 차이때문에 이렇게 결과값이 동일하지 않게 나올 수 있다고 합니다.