241016 TIL - Java Thread 개념 정리(Single, Multi, Daemon)

J_log·2024년 10월 16일
0

Java 스터디 정리

목록 보기
4/5

프로세스와 쓰레드

프로세스는 실행 중인 프로그램을 의미한다. Java프로그램을 실행시키면 이 프로그램은 프로세스라는 이름으로 운영체제 위에서 실행된다.
즉 운영체제 위에서 실행되는 모든 프로그램은 운영체제가 만들어준 프로세스에서 실행된다.

쓰레드는 프로세스 내에서 실행되는 가벼운 작업의 흐름이다. 쉽게 생각하면 일꾼이라고 할 수 있다. 하나의 프로세스는 여러 개의 쓰레드를 가질 수 있다. 쓰레드들은 실행을 위한 프로세스 내 주소 공간이나 메모리 공간(Heap)을 공유 받는다. 추가로 쓰레드들은 각각 명령 처리를 위한 자신만의 메모리 공간(Stack)도 할당받는다.

싱글 쓰레드

프로세스 안에서 하나의 쓰레드만 실행되는 것을 말한다.

  • Java 프로그램의 경우 메인 메서드만 실행시켰을 때 이것을 싱글 쓰레드라고 한다.
  • JVM의 메인 쓰레드가 종료되면 JVM도 같이 종료된다.

멀티 쓰레드

프로세스 안에서 여러 개의 쓰레드가 실행되는 것을 말한다.

  • 메인 쓰레드 외에 다른 작업 쓰레드들을 만들어 여러개의 실행 흐름을 만들 수 있다.

멀티 쓰레드의 장점

  • 여러 개의 작업을 동시에 할 수 있어서 성능이 좋아진다.
  • 스택을 제외한 모든 영역에서 메모리를 공유하기 때문에 자원을 효율적으로 사용할 수 있다.
  • 응답 쓰레드와 작업 쓰레드를 분리하여 빠르게 응답을 줄 수 있다.

멀티 쓰레드의 단점

  • 동기화 문제가 발생할 수 있다.
    • 프로세스의 자원을 공유하면서 작업을 처리하기 때문에 자원을 서로 사용하려고 하는 충돌이 발생하는 경우
  • 교착 상태가 발생할 수 있다 (데드락)
    • 둘 이상의 쓰레드가 서로의 자원을 원하는 상태가 되었을 때 서로 작업이 종료되기만을 기다리며 작업을 더 이상 진행하지 못하게 되는 상태

멀티 쓰레드 사용하기

public class Main {
    public static void main(String[] args) {
        Runnable task = () -> {
            for (int i = 0; i < 100; i++) {
                System.out.print("$");
            }
        };
        Runnable task2 = () -> {
            for (int i = 0; i < 100; i++) {
                System.out.print("*");
            }
        };


        Thread thread1 = new Thread(task);
        thread1.setName("thread1");
        Thread thread2 = new Thread(task2);
        thread2.setName("thread2");

        thread1.start();
        thread2.start();
    }
}

Runnable 인터페이스에 람다식을 사용하여 쓰레드를 구현했다.
setName으로 쓰레드의 이름을 지정할 수 있다.


데몬 쓰레드

낮은 우선순위를 가진 쓰레드를 말한다.

  • 보조적인 역할을 담당하며 대표적인 데몬 쓰레드로는 메모리 영역을 정리해 주는 가비지 컬렉터 (GC)가 있다.

데몬 쓰레드 설정 방법

    public class Main {
    public static void main(String[] args) {
        Runnable demon = () -> {
            for (int i = 0; i < 1000000; i++) {
                System.out.println("demon");
            }
        };

        Thread thread = new Thread(demon);
        thread.setDaemon(true);

        thread.start();

        for (int i = 0; i < 100; i++) {
            System.out.println("task");
        }
    }
}

setDaemon(true)로 데몬 쓰레드로 지정해줄 수 있다.
데몬 쓰레드는 우선순위가 낮고 다른 쓰레드가 모두 종료되면 강제 종료 당하기 때문에 main()쓰레드의 task가 100번이 먼저 찍히면 종료되어 1000000번 수행되지 않고 종료된다.


쓰레드 우선순위

쓰레드 작업의 중요도에 따라서 우선순위를 부여할 수 있다.

  • 쓰레드는 생성될 때 우선순위가 정해진다
    • 이 우선순위는 직접 지정해주거나 JVM에 의해 지정될 수 있다.
  • 우선순위는 3가지 우선순위로 나뉜다.
    • 최대 우선순위 (MAX_PRIORITY) = 10
    • 보통 우선순위 (NROM_PRIORITY) = 5
    • 최소 우선순위 (MIN_PRIORITY) = 1
      기본 값은 보통으로 되어있다.
  • 1 ~ 10 사이의 숫자로 지정도 가능하다
  • 이 우선순위의 범위는 OS가 아니라 JVM에서 설정한 우선순위이다.

우선순위 설정하기

Thread thread1 = new Thread(task1);
thread1.setPriority(8);

setPriority() 메서드로 설정할 수 있다. ()안에 1 ~ 10 까지 우선순위 부여.
setPriority(Thread.MIN_PRIORITY) 처럼 Thread 클래스의 상수로 지정된 값을 넣어줘도 된다.

int threadPriority = thread1.getPriority();
System.out.println("threadPriority = " + threadPriority);

getPriority() 메서드로 우선순위를 확인할 수 있다.

post-custom-banner

0개의 댓글