쓰레드는 우선순위라는 속성을 가지고 있는데, 이 우선순위의 값에 따라 쓰레드가 얻는 실행시간이 달라진다.
예를 들어, 파일전송기능이 있는 메신저의 경우, 파일 다운로드를 처리하는 쓰레드보다 채팅 내용을 전송하는 쓰레드의 우선순위가 더 높아야 사용자가 채팅하는데 불편함이 없을 것 이다.
우선순위 범위는 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
프로그램을 종료합니다.