1. 쓰레드의 우선순위에 대한 개념
- 쓰레드는 기본적으로 우선순위라는 속성(멤버변수)를 가진다.
- 이 값에 따라 실행시간이 달라진다.
- 쓰레드가 가질 수 있는 우선순의 값 범위는 1~10이며 높을수록 높다.
- 기본적으로 5의 값을 가진다.
- 만약 각각 쓰레드 th1, th2는 7와 5의 우선순위를 가진다면, 싱글 코어에서는 th1부터 먼저
실행하게 되며, th2보다 더 빨리 작업을 마친다. 그러나 만약 멀티코어에서 수행하게 되면
th1이 더 빨리 수행되긴하지만 거의 차이 없이 똑같이 번갈아가면서 출력한다.
( 멀티코어에서는 별 차이가 없을정도가 아니라 전혀 없다. )
( 그러므로, 우선순위를 부여하는 대신 PriorityQueue 클래스에 저장해 놓고, 우선순위가 높은
작업을 먼저 처리하는 것이 낫다. )
( 위의 그림은 싱글 코어로 두 개의 쓰레드로 두 개의 작업을 실행했을 때의 결과를 보여준다. )
( 싱글코어에서는 확실히 똑같은 시간에서 작업량의 차이가 나지만, 멀티코어는 의미가 없어진다. )
2. 쓰레드 그룹
- 쓰레드 그룹은 말 그대로 쓰레드의 그룹이며, 우리가 파일을 다루는 것과 같다.
- 만들어진 이유는 보안상 때문인데, 자신이 속한 그룹의 쓰레드나 하위 쓰레드를 변경할 수
있지만, 서로 다른 그룹의 쓰레들끼리는 서로 변경할 수 없다.
- 모든 쓰레드는 쓰레드 그룹에 속해야한다. 그러므로, JVM은 main과 system을 만들고
운영에 필요한 쓰레드를 생성해서 그룹에 포함시킨다.
( 예를 들어, main 메서드는 main 쓰레드 그룹에, Finalizer 쓰레드는 system에 속한다. )
- 우리가 생성하는 모든 쓰레드 그룹은 main 쓰레드 그룹의 하위 쓰레드 그룹이다.1
- 쓰레드 그룹과 관련된 메서드는 아래와 같다.
메서드 | 설명 |
ThreadGroup getThreadGroup() | 쓰레드 자신이 속한 쓰레드 그룹을 반환한다. |
void uncaughtException(Tread t, Throwable e) | 쓰레드 그룹의 쓰레드가 처리되지 않은 예외에 의해 실행이 종료되었을 때, JVM에 의해 이 메서드가 자동적으로 호출된다. |
2-1. 쓰레드 그룹을 이해하기 위한 예제(1)
: 기본적으로 쓰레드를 만들고 그룹을 생성하여 그에 대한 정보를 출력해보는 예제이다.
public class Exercise006 {
public static void main(String[] args) {
ThreadGroup main = Thread.currentThread().getThreadGroup();
ThreadGroup grp1 = new ThreadGroup("Group1");
ThreadGroup grp2 = new ThreadGroup("Group2");
//ThreadGroup(ThreadGroup parent ,String name)
ThreadGroup subGrp1 = new ThreadGroup(grp1, "SubGroup1");
grp1.setMaxPriority(3);
Runnable r = new Runnable() {
@Override
public void run() {
try {
Thread.sleep(1000);
}catch (Exception e) {
// TODO: handle exception
}
}
};
//Thread(ThreadGroup tg, Runnable r, String name)
new Thread(grp1, r, "th1").start();
new Thread(grp2, r, "th2").start();
new Thread(subGrp1, r, "th1-1").start();
System.out.println(">>List of ThreadGroup: " + main.getName()
+", Active ThreadGroup: " + main.activeGroupCount()
+", Active Thread: " + main.activeCount());
main.list();
}
}
( currentThread()는 현재 실행중인 쓰레드의 참조를 반환한다. )
( 새로 생성된 쓰레드 그룹은 main 쓰레드 그룹의 하위 그룹으로 포함된다. )
( setMaxPriority(3)을 grp1에 했더니, 하위 그룹에게도 영향을 주었다. )
( 참조변수 없이 new Thread()로 만들었는데, 가비지 컬렉터의 제거대상이 되지 않는다. )
( 그 이유는 이 쓰레드의 참조가 ThreadGroup에 저장되어 있기 때문이다. )
'자바 > 프로세스와 쓰레드' 카테고리의 다른 글
쓰레드의 실행제어 (0) | 2022.02.20 |
---|---|
데몬 쓰레드 (0) | 2022.02.14 |
싱글쓰레드와 멀티쓰레드 (0) | 2022.02.14 |
쓰레드의 기본적 구현과 실행 (0) | 2022.02.14 |
프로세스와 쓰레드의 전반적인 개념 (0) | 2022.02.14 |