🌱 오늘의 주제 : 쓰레드의 우선순위 & 데몬 쓰레드
🌱 쓰레드의 우선순위
- 쓰레드는 우선순위라는 속성을 가지고 있는데, 이 우선순위의 값에 따라 쓰레드가 얻는 실행시간이 달라진다.
- 예를 들어, 파일전송기능이 있는 메신저의 경우, 파일 다운로드를 처리하는 쓰레드보다 채팅 내용을 전송하는 쓰레드의 우선순위가 더 높아야 사용자가 채팅하는데 불편함이 없을 것 이다.
- 우선순위 범위는 1~ 10이며, 숫자가 높을수록 우선순위가 높다.
- 쓰레드의 우선순위는 쓰레드를 생성한 쓰레드로부터 상속받는다.
- 예를 들어, main메서드를 수행하는 쓰레드는 우선순위가 5이므로, main메서드 내에서 생성하는 쓰레드의 우선순위는 자동적으로 5가 된다.
- 쓰레드를 실행하기 전에만 우선순위를 변경할 수 있다.
void setPriority(int newPriority) //쓰레드의 우선순위를 지정한 값으로 변경한다.
int 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
-||-|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
--|||||||||--|------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
🌱 쓰레드 그룹(thread group)
- 쓰레드 그룹은 서로 관련된 쓰레드를 그룹으로 다루기 위한 것이다.
- 보안상의 이유로 도입된 개념이다.
- 자신이 속한 쓰레드 그룹이나 하위 쓰레드 그룹은 변경할 수 있지만 다른 쓰레드 그룹의 쓰레드를 변경할 수는 없다.
- 쓰레드 그룹에 포함시키려면 Thread 의 생성자를 이용하면 된다.
- 모든 쓰레드는 반드시 쓰레드 그룹에 포함되어 있어야 한다.
- 그룹을 지정하지 않고 생성한 쓰레드는 자동적으로 main쓰레드 그룹에 속하게 된다.
ThreadGroup getThreadGroup(). // 쓰레드 자신이 속한 쓰레드 그룹을 반환
void uncaughtException(Thread t, Throwable e). // 처리되지 않은 예외에 의해 쓰레드가 종료 되었을때, 자동으로 JVM에 의해서 호출.
🌱 데몬 쓰레드(daemon thread)
- 데몬 쓰레드는 다른 일반 쓰레드의 작업을 돕는 보조적인 역할을 한다.
- 일반 쓰레드가 모두 종료되면 데몬 쓰레드는 강제적으로 자동 종료된다.
- 예를 들어, 가비지 컬렉터, 워드프로세서의 자동저장, 화면자동갱신
- 무한루프와 조건문을 이용해서 실행 후 대기하고 있다가, 특정 조건이 만족되면 작업을 수행하고 다시 대기하도록 작성된다.
- 데몬 쓰레드는 일반 쓰레드의 작성방법과 동일하며, 다만 쓰레드를 생성한 다음 실행하기 전에 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
프로그램을 종료합니다.
'Java' 카테고리의 다른 글
Java - 쓰레드의 동기화 & wait()과 notify() (0) | 2023.03.23 |
---|---|
Java - 쓰레드의 상태 (0) | 2023.03.23 |
Java - 싱글쓰레드와 멀티쓰레드 & 쓰레드의 I/O 블락킹(blocking) (0) | 2023.03.20 |
Java - 쓰레드란? (0) | 2023.03.16 |
Java - 에너테이션의 조상, 규칙, 활용 (0) | 2023.03.16 |