Java – 스레드 및 데몬 스레드의 우선 순위

오늘의 주제: 스레드 우선순위 및 데몬 스레드

스레드 우선순위


  • 쓰레드는 Priority라는 속성을 가지고 있고 그 Priority 값에 따라 쓰레드가 얻는 실행시간이 달라진다.
    • 예를 들어 파일 전송 기능이 있는 메신저에서는 채팅 내용을 전송하는 스레드가 파일 다운로드를 처리하는 스레드보다 우선 순위가 높아야 사용자가 채팅하는 데 불편을 느끼지 않습니다.
  • 우선순위 범위는 1부터 10까지이며 숫자가 높을수록 우선순위가 높습니다.
  • 스레드의 우선순위는 그것을 생성한 스레드에 의해 상속됩니다.
    • 예를 들어 메인 메서드를 실행하는 스레드의 우선순위는 5이므로 기본 메서드 내에서 생성된 모든 스레드의 우선순위는 자동으로 5로 설정됩니다.
  • 스레드를 실행하기 전에만 우선 순위를 변경할 수 있습니다.

무효 setPriority(int newPriority) // 스레드의 우선 순위를 주어진 값으로 변경합니다.
정수 getPriority() // 스레드의 우선 순위를 반환합니다.

public static final int MAX_PRIORITY = 10 //최대 우선순위
public static final int MIN_PRIORITY = 1 // 최소 우선순위
public static final int NORM_PRIORITY = 5 // 보통 우선순위

public class ex13_6 {

	public static void main(String() args) throws Exception {
		// 쓰레드 우선순위
		ThreadEx6_1 th1 = new ThreadEx6_1();
		ThreadEx6_2 th2 = new ThreadEx6_2();
		
		th2.setPriority(7);  // 지정 안 할 경우 기본적으로 5로 세팅
		
		System.out.println("Prority of th1(-) : " + th1.getPriority());
		System.out.println("Prority of th2(|) : " + th2.getPriority());
		th1.start();
		th2.start();
		
	}

}

	class ThreadEx6_1 extends Thread{
		public void run() {
			for(int i =0; i < 300; i++) {
				System.out.print("-");
				for (int x = 0; x < 10000000; x++); // 시간 지연용 for문
			}
		}
	}
	
	class ThreadEx6_2 extends Thread {
		public void run() {
			for(int i = 0; i < 300; i++) {
				System.out.print("|");
				for(int x = 0; x < 10000000; x++);
			}
		}
	}
    
    --------
Prority of th1(-) : 5
Prority of th2(|) : 7
-||-||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||| 
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
--|||||||||--|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

테마 그룹


  • 스레드 그룹은 관련 스레드를 그룹으로 취급하는 데 사용됩니다.
  • 이 개념은 보안상의 이유로 도입되었습니다.
  • 자신이 속한 스레드 그룹 또는 하위 스레드 그룹은 변경할 수 있지만 다른 스레드 그룹의 스레드는 변경할 수 없습니다.
  • 스레드 그룹에 포함하려면 스레드 생성자를 사용하십시오.
  • 모든 스레드는 스레드 그룹에 포함되어야 합니다.
  • 그룹을 지정하지 않고 생성된 쓰레드는 자동으로 메인 쓰레드 그룹에 속하게 됩니다.

스레드 그룹 getThreadGroup(). // 쓰레드가 속한 쓰레드 그룹을 반환
무효 uncaughtException (Thread t, Throwable e). // 스레드가 처리되지 않은 예외에 의해 종료될 때 JVM에 의해 자동으로 호출됩니다.


데몬 스레드


  • 데몬 스레드는 다른 일반 스레드의 작업을 돕는 지원 역할을 합니다.
  • 모든 일반 스레드가 종료되면 데몬 스레드가 자동으로 강제 종료됩니다.
    • 예를 들어 가비지 수집기, 워드 프로세서에 자동 저장, 자동 화면 업데이트
  • 무한 루프와 조건문을 이용하여 실행하고 대기하고, 특정 조건이 충족되면 다시 실행하고 대기하도록 작성되었습니다.
  • 데몬 스레드는 일반 스레드와 동일한 방식으로 생성됩니다. 단, 스레드를 생성한 후 실행하기 전에 setDaemon(true)을 호출하기만 하면 됩니다.
  • 데몬 스레드에 의해 생성된 스레드는 자동으로 데몬 스레드가 됩니다.

boolean isDaemon() // 스레드가 데몬 스레드인지 확인합니다. 데몬 스레드이면 true를 반환합니다.
void setDaemon(boolean on) // 스레드를 데몬 스레드 또는 사용자 스레드로 변경합니다. on 매개변수의 값이 true로 설정되면 데몬 스레드가 됩니다.

public class ex13_7 implements Runnable{
	static boolean autoSave = false;

	public static void main(String() args) {
		// 데몬 쓰레드(daemon thread)
	
		Thread t = new Thread(new ex13_7());
		t.setDaemon(true);  // 이부분이 없으면 종료되지 않는다.
		t.start();
		
		for(int i = 1; i <= 10; i++) {
			try {
				Thread.sleep(1000);
				
			} catch (InterruptedException e) {}
			System.out.println(i);
			
			if(i == 5) autoSave = true;
		}
		System.out.println("프로그램을 종료합니다.");
		
	}
		public void run() {
			while(true) {
				try {
					Thread.sleep(3 * 1000);  // 3초마다
				} catch (InterruptedException e) {}
				
				// autoSave의 값이 true이면 autoSave()를 호출한다.
				if (autoSave) autoSave();
			}
		}
		
		public void autoSave() {
			System.out.println("작업파일이 자동저장 되었습니다.");
		}

	}


--------
1
2
3
4
5
작업파일이 자동저장 되었습니다.
6
7
8
작업파일이 자동저장 되었습니다.
9
10
프로그램을 종료합니다.