ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java 자바] 12. 멀티 스레드 ① 개념과 생성방법, 우선순위
    Programming/Java 2022. 9. 12. 14:02
    반응형

    12-1. 멀티 스레드란?

    12-1-1. 프로세스와 스레드

    - 프로세스: 운영체제에서 실행 중인 하나의 애플리케이션 

    - 멀티태스킹: 두 가지 이상의 작업을 동시에 처리하는 것

    => 멀티태스킹이 꼭 멀티프로세스를 뜻하지는 않으며, 한 프로세스 내에서 두 가지 이상의 작업을 처리할 수 있음

    => 멀티 스레드를 이용하여 한 프로세스 내에서 여러가지 작업을 가능하게 하는 것!

    - 멀티 프로세스들은 운영체제에서 할당 받은 자신의 메모리를 가지고 실행되기 때문에 상호 독립적
    - 멀티 스레드로 동작하는 파일은 다른 스레드에서 오류가 발생하면 함께 영향을 받음 => 예외, 오류 처리에 주의해야 함

    12-1-2. 메인 스레드

    - 모든 자바 어플리케이션은 메인 스레드가 main() 메소드를 실행하면서 시작

    - 기본적으로 위에서 아래 순서대로 코드를 실행하며, 필요에 따라 작업 스레드를 만들어 병렬로 코드를 실행
     => 멀티 스레드를 만들어 멀티 태스킹을 수행

    - 싱글스레드는 메인스레드가 종료되면 프로세스가 종료됨

    - 멀티스레드는 메인스레드가 작업 스레드보다 먼저 종료되더라도 다른 작업 스레드가 종료될 때까지 프로세스가 종료되지 않음

    12-2. 작업 스레드 생성과 실행

    - 멀티 스레드로 실행하기 위해선 몇 개의 작업을 병렬로 실행할지 결정 후, 각 작업별 스레드를 생성해야 함

    - 작업스레드 생성 방법 ① java.lang.Thread 클래스를 직접 객체화 ② Thread 상속하여 하위 클래스 생성

    12-2-1. Thread 클래스로부터 직접 생성

    - Runnable을 매개값으로 갖는 생성자 호출

    - Runnable은 인터페이스 타입으로 구현 객체를 만들어 대입해야 하며, run() 메소드를 재정의하여 작업스레드가 실행할 코드 작성

    // 1. 작업스레드 객체를 생성(Runnable을 매개값으로 갖는 생성자 호출)
    Thread thread = new Thread(Runnable target);
    
    // 2-1. Runnable 구현 클래스 작성
    class Task implements Runnable {
      public void run() {
        스레드가 실행할 코드;
      }
    }
    
    // Runnable은 작업 내용을 가지고 있는 객체로,
    // Thread 생성자를 호출해야 작업 스레드가 생성됨
    Runnable task = new Task();
    Thread thread = new Thread(task);
    
    // 2-2. Thread생성자 호출 시 Runnable 익명 객체를 매개값으로 사용하는 방법
    // 좀 더 효율적으로 사용할 수 있음
    Thread thread = new Thread(new Runnable() {
      public void run() {
        스레드가 실행할 코드;
      }
    });
    
    // 3. 작업스레드는 즉시 실행되지 않고, 다음과 같이 start()메소드를 실행해야 함
    thread.start();

    12-2-2. Thread 하위 클래스로부터 생성

    - Thread 클래스 상속 후 run 메소드를 재정의(overriding)하여 실행할 코드를 작성

    // 1-1. 작업스레드 클래스로부터 작업스레드 객체 생성
    public class WorkerThread extends Thread {
      @Override
      public void run() {
        스레드가 실행할 코드;
      }
    }
    Thread thread = new WorkerThread();
    
    // 1-2. 익명객체로 작업스레드 객체 생성
    Thread thread = new Thread() {
      public void run() {
        스레드가 실행할 코드;
      }
    };
    
    // 2. thread 실행
    thread.start();

    12-2-3. 스레드의 이름

    - 메인 스레드: main

    - 직접 생성한 스레드: 자동적으로 "Thread-n"이라는 이름으로 설정됨 (n은 스레드 번호)

    // 스레드 이름 변경
    thread.setName("스레드이름");
    
    // 스레드 이름 조회
    thread.getName();
    
    // 현재 실행 중인 스레드의 참조 얻기
    Thread thread = Thread.currentThread();

    12-3. 스레드 우선순위

    - 동시성: 멀티 작업을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질

    - 병렬성: 멀티 작업을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질

    - 스레드 스케줄링: 스레드의 개수가 코어의 수보다 많을 경우, 스레드를 어떤 순서에 의해 동시성으로 실행할 것인가를 결정하는 것

    ① 우선순위 방식 : 우선순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링
      - 스래드 객체에 우선순위 번호 부여가 가능하므로 코드로 제어할 수 있음
      - 1~10까지 우선순위 부여가 가능하며, 1이 우선순위가 가장 낮음
      - 우선순위를 부여하지 않으면 기본적으로 5의 우선순위를 할당 받음

      - 우선순위 변경은 setPriority() 메소드를 이용

      - 최소 5개 이상의 스레드가 실행되어야 우선순위에 영향을 받음(4개까지는 병렬성으로 실행될 수 있음)

    thread.setPriority(우선순위);
    
    // 값을 직접 줘도 되고, 코드의 가독성을 높이기 위해 상수를 사용할 수도 있음
    thread.setPriority(Thread.MAX_PRIORITY);
    thread.setPriority(Thread.NORM_PRIORITY);
    thread.setPriority(Thread.MIN_PRIORITY);

    ② 순환할당 방식 : 시간 할당량을 정해, 하나의 스레드를 정해진 시간만큼 실행하고 다시 다른 스레드를 실행하는 방식
      - 자바 가상 기계에 의해 정해지기 때문에 코드로 제어 불가

    반응형

    댓글

Designed by Tistory.