관리 메뉴

너와 나의 스토리

[Java] 멀티 스레드 - 우선순위 설정 / 동기화 본문

Programming Language/Java

[Java] 멀티 스레드 - 우선순위 설정 / 동기화

노는게제일좋아! 2021. 5. 3. 14:56
반응형

프로세스 vs 스레드

  • 프로세스
    • 운영체제에서는 실행 중인 하나의 애플리케이션
    • 사용자가 애플리케이션을 실행하면 운영체제로부터 실행에 필요한 메모리를 할당받아 애플리케이션의 코드를 실행하는데 이것이 프로세스이다.
    • 하나의 애플리케이션에서 여러 개의 프로세스가 만들어질 수 있다.
  • 스레드
    • 하나의 코드 실행 흐름

 

 

 

멀티 태스킹(Multi tasking)

  • 여러 개의 작업을 동시에 처리하는 것
  • 운영체제는 멀티 테스킹을 할 수 있도록 CPU 및 메모리 자원을 프로세스마다 적절히 할당해주고, 병렬로 실행시킨다.
  • 멀티 태스킹의 예
    • 멀티 프로세스(Multi process): 여러개의 프로세스를 병렬로 실행
    • 멀티 스레드(Multi thread): 하나의 프로세스 내에서 여러개의 작업을 병렬로 처리

 

Multiprocessing vs Multithreading

  • 멀티 프로세스는 운영체제에서 할당받은 자신의 메모리를 가지고 실행하기 때문에 서로 독립적.
    • 하나의 프로세스에서 오류가 발생해도 다른 프로세스에 영향을 미치지 않음.
  • 멀티 스레드는 하나의 프로세스 내부에 생성되어 스레드끼리 메모리 공간을 서로 공유하기 때문에 
    • 하나의 스레드가 예외를 발생시키면 프로세스 자체가 종료될 수 있다.

 

 

메인 스레드(Main thread)

  • 모든 자바 애플리케이션은 메인 스레드가 main() 메서드를 실행시키면서 시작된다.
  • 메인 스레드는 필요에 따라 작업 스레드들을 만들어서 병렬로 코드를 실행할 수 있다. -> 멀티 스레드 애플리케이션
  • 모든 스레드가 종료되어야만 프로세스가 종료된다.

 

작업 스레드

 

작업 스레드 객체 생성

  • Runnable을 매개 값으로 갖는 생성자를 호출해야 한다.
Thread thread = new Thread(Runnable target);
  • Runnable은 인터페이스 타입이기 때문에 구현 객체를 만들어 대입해야 한다.
    • 그리고, run() 메서드를 재정의해 작업 스레드가 실행할 코드를 작성해야 한다.
class Task implements Runnable {
	public void run() {
		// 스레드가 실행할 코드
	}
}
  • 이렇게도 사용 가능
Thread thread = new Thread(() -> {
	// 스레드가 실행할 코드
});

 

작업 스레드 실행

  • 이 명령을 이용해 run() 메서드를 실행시킨다.
thread.start();
  • Runnable을 상속받아 thread를 만드는 것이 아니라, Thread의 하위 클래스로 작업 스레드를 정의할 수 있다.
class WorkThread extends Thread {
	@Override
	public void run() {
		// 스레드가 실행할 코드
	}
}
Thread thread = new WorkThread();

 

스레드 이름 설정

thread.setName("thread name");
  • 이름 조회
thread.getName();

 

현재 스레드의 참조 얻기

  • 현재 코드를 실행 중인 스레드 객체를 얻을 수 있다.
Thread thread = thread.currentThread();

 

 

스레드 우선순위

  • 멀티 스레드는 동시성 또는 병렬성으로 실행된다.
    • 동시성(Concurrency): 멀티 테스킹을 위해 하나의 코어에서 멀티 스레드가 번갈아가며 실행하는 성질 
      • 실제로 동시에 수행되는 것이 아니라, 빠르게 번갈아가며 실행됨.
    • 병렬성(Parallelism): 멀티 테스킹을 위해 멀티 코어에서 개별 스레드를 동시에 실행하는 성질
  • 스레드 스케줄링: 스레드를 어떤 순서로 동시성을 실행할 것인지 결정하는 것
  • 자바의 스레드 스케줄링은 우선순위(Priority) 방식과 순환 할당(Round-Robin) 방식을 사용한다.
    • Priority 방식: 우선순위가 높은 스레드가 실행 상태를 더 많이 가짐
    • Round-Robin: time slice를 정해 하나의 스레드를 정해진 
      • JVM에 의해 정해지기 때문에 개발자가 코드로 제어 불가.

 

Priority 방식

  • 우선순위 설정
    • 1~10으로 부여하면 됨.
      • 우선 순위 높을수록 작업 빨리 끝남
    • 우선순위 부여 안 하면 디폴트로 5가 부여됨
    • 1~10 값 직접 입력해도 되고, Thread 클래스 상수로 줄 수도 있다.
      • Thread.MAX_PRIORITY
      • Thread.NORM_PRIORITY
      • Thread.MIN_PRIORITY
thread.setPriority(우선순위);

 

 

동기화 메서드 및 동기화 블록

  • 임계 영역(Critical) section: 멀티 스레드 프로그램에서 단 하나의 스레드만 실행할 수 있는 코드 영역
  • 자바는 임계 영역을 지정하기 위해 동기화(synchronized) 메서드와 동기화 블록을 제공한다.

 

동기화 메서드를 만드는 방법

  • synchronized 키워드 붙이기
  • synchronized 키워드는 인스턴스와 정적 메서드 어디든 붙일 수 있다. 
public synchronized void method() {
}
  • 동기화 메서드는 메서드 전체가 임계 영역이다.

 

동기화 블럭

  • 일부 코드 부분만 임계 영역으로 만들고 싶다면 다음과 같이 동기화 블럭을 만들면 된다.
public void method() {
  // ...
  synchronized(공유객체) {
  	// 임계 영역
  }
  // ...
}

 

 

 

 

출처:

- [이것이 자바다]

반응형
Comments