[Java] 쓰레드 (2)

이병수·2024년 1월 16일
0

Java

목록 보기
23/27
post-thumbnail

데몬 쓰레드와 사용자 쓰레드


데몬 쓰레드

보이지 않은 곳(background)에서 실행되는 낮은 우선순위를 가진 쓰레드를 의미한다.

보조적인 역할을 담당하며 대표적인 데몬 쓰레드로는 메모리 영역을 정리해주는 가비지 컬렉터(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); // true로 설정시 데몬스레드로 실행됨
		thread.start();

		for (int i = 0; i < 100; i++) {
			System.out.println("task");
		}
	}
}
  • 람다식을 사용하여 demon 쓰레드를 설정해주었다.

  • setDaemon(true) 를 통해서 데몬 쓰레드로 설정을 하고 실행을 하였다.

  • 결과적으로 보면 demon 쓰레드는 우선순위가 낮기 때문에 다른 쓰레드 (Main 쓰레드) 가 종료되면 강제 종료가 되기 때문에 demon이라는 출력문이 1000000 수행되지 않는다.


사용자 쓰레드

보이는 곳(foreground) 에서 실행되는 높은 우선순위를 가진 쓰레드를 의미한다.

  • 프로그램 기능을 담당하며 대표적인 사용자 쓰레드로는 메인 쓰레드(Main 쓰레드)가 있다.

  • 사용자 쓰레드들이란, 기존에 우리가 따로 만들어놓은 쓰레드들이 다 사용자 쓰레드이다.


주의 !

  • JVM은 사용자 쓰레드의 작업이 끝나면 데몬 쓰레드도 자동으로 종료시킨다.


쓰레드 우선순위와 쓰레드 그룹


쓰레드 우선순위

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

  • 작업의 중요도가 높을 때 우선순위를 높게 지정하면 더 많은 작업 시간을 부여 받아 빠르게 처리할 수 있음
  • 우선순위는 사용자가 직접 하거나 JVM에 의해 지정될 수 있다.

우선순위 (최대/최소/보통)

  1. 최대 우선순위 (MAX_PRIORITY) = 10

  2. 최소 우선순위 (MIN_PRIORITY) = 1

  3. 보통 우선순위 (NROM_PRIOIRTY) = 5


  • 디폴트 값이 보통 우선순위인 5이다.

  • 스레드의 우선순위는 setPriority() 메서드로 설정할 수 있다
Thread thread1 = new Thread(task1);
thread1.setPrioirty(8);		// 우선순위를 8로 설정

  • getPriority() 메서드로 해당 메서드의 우선순위를 반환할 수 있다.
int threadPriorty = thread1.getPriority();

주의!! 우선순위가 높다고 반드시 쓰레드가 먼저 종료되는 것이 아닌, 확률이 높아지는 것 뿐이다.


쓰레드 그룹

서로 관련이 있는 쓰레드들을 그룹으로 묶어서 다룰 수 있다.

  • 기본적으로 쓰레드들은 그룹에 포함되어 있다.

    • JVM이 시작되면 system 그룹이 생성되고 쓰레드들은 기본적으로 system 그룹에 포함이 된다.
  • 메인 쓰레드는 system 그룹 하위에 있는 main 그룹에 포함된다.

  • 모든 쓰레드들은 반드시 하나의 그룹에 포함되어야 한다.

    • 쓰레드 그룹을 지정하지 않으면 해당 쓰레드는 자동으로 main 그룹에 포함된다.

쓰레드 그룹 생성

ThreadGroup group1 = new ThreadGroup("Group1"); // ThreadGroup 클래스로 객체를 만듭니다.

// Thread(ThreadGroup group, Runnable target, String name)
Thread thread1 = new Thread(group1, task, "Thread 1"); // Thread 객체 생성시 첫번째 매개변수로 넣어줍니다.

// Thread에 ThreadGroup 이 할당된것을 확인할 수 있습니다.
System.out.println("Group of thread1 : " + thread1.getThreadGroup().getName());

쓰레드 그룹으로 묶어서 쓰레드 관리

  • ThreadGroup 객체의 interrupt() 메서드를 실행시키면 해당 그룹 쓰레드들이 실행 대기 상태로 변경
ThreadGroup group1 = new ThreadGroup("Group1");  // ThreadGroup 클래스로 객체를 만듭니다.

// Thread(ThreadGroup group, Runnable target, String name)
Thread thread1 = new Thread(group1, task, "Thread 1"); 
Thread thread2 = new Thread(group1, task, "Thread 2");

group1.interrupt(); // 일시정지 상태인 쓰레드를 실행대기 상태로 변환

참고

profile
백엔드 개발자가 되고 싶어요

0개의 댓글