오늘의 주제: 스레드 우선순위 및 데몬 스레드
스레드 우선순위
- 쓰레드는 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
프로그램을 종료합니다.
