쓰레드의 우선순위
쓰레드는 우선순위라는 속성을 가지고 있다.(멤버변수)
이 우선순위 값에 따라 쓰레드가 얻는 실행시간이 달라진다.
쓰레드가 수행하는 작업의 중요도에 따라 쓰레드의 우선순위를 서로 다르게 지정하여 쓰레드가 더 많은 작업시간을 갖도록 할 수있다.
-즉 더 중요한 쓰레드에게 우선순위를 높게 주어서 더 많은 작업시간을 가지게 할 수 있다는 것
자바에서 쓰레드의 우선순위를 1~10까지 보유할 수있다.
기본적으로 보통우선순위는 5, 최소 우선순위는1, 최대 우선순위는 10이다.
우리가 생성하고, 아무것도 지정하지않으면 5, 기본값을 얻게된다.
void setPriority(int newPriority) // 쓰레드의 우선순위를 지정한 값으로 변경
int getPriority() //쓰레드의 우선순위 반환
쓰레드의 우선순위 숫자를 변경 할 수있고 우선순위를 반환받을 수 있다.
2개의 쓰레드가 있다.
A와 B가 있다면, 둘다 우선순위가 같을경우 = 작업시간은 둘다 같다.
우선순위가 A가 높은경우 = A작업시간이 더 길다.
그러다보면 A작업이 먼저 끝나게 된다.(동일한 작업일 경우)
그러나 우리가 이렇게 정해주는 우선순위는 "희망사항"에 불과하다...
JVM내에서 우선순위일뿐이지 OS스케줄러에서 참고만할 뿐 판단되어 실행된다.
예제를 통해 우선순위에 대해 알아보자.
package ch13.Thread;
public class ThreadEx8 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadEx8_1 th1 = new ThreadEx8_1();
ThreadEx8_2 th2 = new ThreadEx8_2();
th2.setPriority(10);
System.out.println("Priority of th1(-) : " + th1.getPriority());
System.out.println("Priority of th2(-) : " + th2.getPriority());
th1.start();
th2.start();
}
}
class ThreadEx8_1 extends Thread {
public void run() {
for (int i = 0; i < 300; i++) {
System.out.print("-");
}
}
}
class ThreadEx8_2 extends Thread {
public void run() {
for (int i = 0; i < 300; i++) {
System.out.print("|");
}
}
}
Th1과 th2모두 main메서드에서 생성해서 main메서드를 실행하는 쓰레드의 우선순위인 5를 상속받았고, 그다음에 setPriority(10)으로 우선순위를 변경한뒤 실행했다.
이처럼 쓰레드를 실행하기 전에만 우선순위를 변경 할 수 있다는 것을 기억하자
우선순위 10을 1로 바꾼다면
이로써 우선순위가 높은 숫자가 먼저 끝난다는걸 알수있다.(즉 더많은 시간을 가지고 작업을 일찍끝낼수있다.)
그런데 계속 돌려보니 꼭 그렇지않았다... OS의 스케줄러에의해 의존되는것을 알수있다.
굳이 우선순위에 차등을 두어 쓰레드를 실행하려면, 특정 OS의 스케줄링 정책과 JVM의 구현을 직접 확인해야한다.
확인한다하더라도 OS의 스케줄러에 종속적이라 예측만 가능한 정도일 뿐 정확히 알 수가없다.
즉
쓰레드에 우선순위를 부여하는 대신 작업에 우선순위를 두어 PriorityQueue에 저장해 놓고, 우선순위가 높은 작업이 먼저 처리되도록 하자
쓰레드의 그룹
쓰레드의 그룹은 서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한것이다.
(폴더를 생성해서 관련된 파일들을 함께 넣어서 관리하는 것처럼)
모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함되어있어야 한다.
또는 쓰레드 그룹에 다른 쓰레드 드룹을 포함 시킬수 있다.
- 쓰레드 그룹은 보안상의 이유로 도입된 개념으로, 자신이 속한 그룹이나 하위 쓰레드 그룹은 변경할 수 있지만 다른 쓰레드 그룹의 쓰레드를 변경할 수는 없다.
쓰레드의 생성자를 보면 쓰레드의 그룹을 지정하는 생성자가있다.
Thread(ThreadGroup group, String name)
Thread(ThreadGroup group, Runnable target)
Thread(ThreadGroup group, Runnable target, String name)
Thread(ThreadGroup group, Runnable target, String name, long stackSize)
그런데 우리는 쓰레드 그룹도, 생성자에 어떤것도 지정해준 적이없다..1!!
그런데도 반드시 하나의 쓰레드 그룹에 포함되어있어야 해서
쓰레드 그룹을 지정하지 않으면 main쓰레드 그룹에 속해진다.
왜냐하면 자신을 생성한 쓰레드(부모쓰레드)의 그룹과 우선순위 상속을 받는다.
main쓰레드 그룹에 속하기 때문에... 우리가 생성하는 쓰레드는 다 기본적으로 속하게된다.
만약 우리가 따로 쓰레드 그룹을 생성해서 만들면 되긴한다.
생성자와 메서드는 https://docs.oracle.com/javase/7/docs/api/ 통해 자세히 보면된다.
쓰레드 하나하나 개별적으로 명령을 내릴수 있지만, 쓰레드 그룹을 통해 명령을 일괄적으로 내릴 수 있따.
대부분 쓰레드 그룹에 대한 정보를 반환하거나 생성하는게 어느정도 중요하다.
그리고 이 단원의 핵심은 쓰레드들은 하나의 그룹으로 묶여져서 다뤄진다.
자바 어플리 케이션이 실행되면, jVM은 main과 System 이라는 쓰레드 그룹을 만들고 JVM운영에 필요한 쓰레드들을 생성 해서 이 쓰레드 그룹에 포함시킨다.
예를 들어 main메서드를 수행하는 main이라는 쓰레드는 mian쓰레드 그룹에 속하고,
가비지컬렉션을 수행하는 Finalizer쓰레드는 system쓰레드 그룹에 속한다.
우리가 생성하는 모든 쓰레드 그룹은 main쓰레드 그룹의 하위 쓰레드 그룹이 되며, 쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 자동적으로 main 쓰레드 그룹에 속하게 된다.
package ch13.Thread;
public class ThreadEx9 {
public static void main(String[] args) {
// TODO Auto-generated method stub
ThreadGroup main = Thread.currentThread().getThreadGroup();
ThreadGroup g1 = new ThreadGroup("Group1");
ThreadGroup g2 = new ThreadGroup("Group2");
ThreadGroup subg1 = new ThreadGroup(g1, "subGroup1");
g1.setMaxPriority(3);
Runnable r = new Runnable() {
public void run() {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
}
}
};
new Thread(g1, r, "th1").start();
new Thread(g2, r, "th2").start();
new Thread(subg1, r, "th3").start();
System.out.println(">>List of ThreadGroup : " + main.getName() + ", Active ThreadGroup : "
+ main.activeGroupCount() + ", Active Thread : " + main.activeCount());
main.list();
}
}
첫번쨰로, 쓰레드 그룹과 쓰레드를 생성하고, main.list()를 호출해서 main쓰레드 그룹의 정보를 출력하도록 했다.
쓰레드 그룹에 대한 정보를 출력하기도 전에 쓰레드가 종료 될 수 있어서
sleep()를 호출해서 1초간 멈추게 하였다.
결과를 보면 쓰레드 그룹에 포함된 하위 쓰레드 그룹이나 쓰레드는 들여쓰기를 이용해서 구별되도록 하였따.
새로 생성한 것과 setMaxPriority()는 쓰레드가 쓰레드 그룹에 추가되기 이전에 호출되어야 한다.
그리고 쓰레드 그룹g1의 최대 우선순위를 3으로 했기때문에 후에 여기에 속하게 된 쓰레드그룹과 쓰레드가 영향을 받았다.
참조변수 없이 쓰레드를 생성해서 바로 실행시켰는데, 가비지 컬렉터의 제거 대상이 되지는 않았따.
이 쓰레드의 참조가 ThreadGroup에 저장되어 있기 때문이다.
'JAVA공부 > 2-쓰레드' 카테고리의 다른 글
쓰레드 제어문(1) (0) | 2021.10.13 |
---|---|
데몬 쓰레드와 쓰레드의 상태(실행제어) (0) | 2021.10.12 |
싱글쓰레드와 멀티쓰레드 (0) | 2021.10.08 |
쓰레드의 구현과 실행 (0) | 2021.10.07 |
프로세스와 쓰레드 (0) | 2021.10.07 |
댓글