Java & Spring/Java

14일차 - Java강의(쓰레드)

DJ.Kang 2024. 8. 1. 20:48

◇ 프로세스와 쓰레드의 개념

  • 프로세스 : 운영체제로부터 자원을 할당받는 작업의 단위
    1. 프로세스의 구조 : Code와 Data그리고 메모리 영역(Stack, Heap)으로 구성
      • Code : main메소와 같은 코드
      • Data : 프로그램이 실행 중 저장 할 수 있는 저장공간
      • Memory : Stack(지역변수, 매개변수, 리턴변수), Heap(동적으로 필요한 변수)를 저장
  • 쓰레드 : 프로세스가 할당받은 자원을 이용하는 실행의 단위
    1. 작업중인 프로그램에서 실행요청이 들어오면 생성
    2. 명령처리를 위한 메모리공간(Stack)도 할당받음

◇ 쓰레드

  • 싱글 쓰레드 : 프로세스 안에서 하나의 쓰레드만 실행되는 것
  • 멀티 쓰레드 : 프로세스 안에서 여러개의 쓰레드가 실행되는 것
    • 멀티 쓰레드의 장점
      1. 동시 작업으로 성능이 좋아진다.
      2. 스택을 제외한 모든 영역에서 메모리를 공유하기 때문에 자원을 효율적으로 사용할 수 있다.
      3. 응답 쓰레드와 작업 쓰레드를 분리하여 빠르게 응답을 줄 수있다. (비동기)
    • 멀티 스레드의 단점
      1. 프로세스의 자원을 공유하면서 작업을 처리하기 때문에 충돌이 발생할 수 있다.
      2. 교착상태가 발생할 수 있다(A가 B를 B가 A를 원하는 상황)
  • Thread : Thread를 extends(상속)받아 구현
    public class Main {
        public static void main(String[] args) {
            TestThread thread = new TestThread();
            thread.start();
        }
    }
    
    class TestThread extends Thread {
        @Override
        public void run() {
            for (int i = 0; i <100; i++) {
                System.out.print("*");
            }
        }
    }


  • Runnable : Runnable을 implements해 구현
    public class Main {
        public static void main(String[] args) {
            Runnable run = new TestRunnable();
            Thread thread = new Thread(run);
    
            thread.start();
        }
    }
    
    class TestRunnable implements Runnable {
        @Override
        public void run() {
            for (int i = 0; i <100; i++) {
                System.out.print("$");
            }
        }
    }

    ※ Runnable 방법을 선호하는 이유 : 인터페이스이기에  클래스를 상속받을 수 있다.
  • 데몬 쓰레드 : 보이지 않는 곳(background)에서 실행되는 낮은 우선순위를 가진 쓰레드
    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); // true로 설정시 데몬스레드로 실행됨
    
            thread.start();
    
            for (int i = 0; i < 100; i++) {
                System.out.println("task");
            }
        }
    }
     demon쓰레드는 우선순위가 낮다, 다른 쓰레드가 모두 종료되면 강제 종료당하기 때문에
    main이 100이 찍히면 그 즉시 종료된다.

  • 사용자 쓰레드 : 보이는 곳(foreground)에서 실행되는 높은 우선순위를 가진 쓰레드
    기존에 만들었던 쓰레드 들이 다 사용자 쓰레드이다.
  • 쓰레드 우선순위와 쓰레드 그룹

    1. 최대 우선순위(MAX_PRIORITY) = 10
    2. 최소 우선순위(MIN_PRIORITY) = 1
    3. 보통 우선순위(NROM_PRIORITY) = 5 → 기본값
      ※ 더 세분하게 1~10으로 지정 가능, 해당 우선순위는 OS가아닌 JVM에서 설정한 우선순위
  • 쓰레드 그룹 : 서로 관련된 쓰레들끼리 그룹으로 묶어 다룰 수 있다.

- 우선순위 설정 및 확인방법

// 설정
Thread thread1 = new Thread(task1);
thread1.setPriority(8);

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