코린이의 소소한 공부노트

쓰레드의 우선순위와 그룹 본문

Java

쓰레드의 우선순위와 그룹

무지맘 2022. 11. 30. 20:41

[쓰레드의 우선순위]

1. 작업의 중요도에 따라 쓰레드의 우선순위를 다르게 하여 특정 쓰레드가 더 많은 작업 시간을 갖도록 할 수 있다.

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; // 보통 우선순위

2. JVM은 우선순위를 10단계로 해놓은 반면 winOS는 32단계로 해놨기 때문에, 우리가 쓰레드의 우선순위를 정했다 하더라도 실제로는 그렇게 실행되지 않는다.

//MyThread1의 run()
for(int i=0 ; i<300 ; i++)
    System.out.print("a");

//MyThread2의 run()
for(int i=0 ; i<300 ; i++)
    System.out.print("b");

// main()
MyThread1 t1 = new MyThread1(); // 기본 우선순위: 5
MyThread2 t2 = new MyThread2();

t2.setPriority(7);
t1.start();
t2.start();

// 결과
aabbbaaabbbbaaa...bbbbaaaaaaa...aaabbbbb
// t2(b) 종료 -> t1(a) 종료를 예상했지만
// OS스케줄러가 정한 실행에 의해 t1이 먼저 끝난 것을 알 수 있다.

// 우선순위의 차가 클수록 높은 우선순위의 쓰레드의 실행이
// 더 먼저 끝날 확률이 커진다.

 

[쓰레드 그룹]

1. 서로 관련된 쓰레드를 그룹으로 묶어서 다루기 위한 것으로, 

2. 모든 쓰레드는 반드시 하나의 쓰레드 그룹에 포함되어있어야 한다.

3. 쓰레드 그룹을 지정하지 않고 생성한 쓰레드는 main쓰레드 그룹에 속한다.

4. 자신을 생성한 쓰레드(조상 쓰레드)의 그룹과 우선순위를 상속받는다.

// 쓰레드의 생성자에 쓰레드 그룹이 매개변수로 들어가있다.
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)

// Thread 클래스의 메서드
ThreadGroup getThreadGroup() // 자신이 속한 쓰레드 그룹을 반환한다.

5. ThreadGroup 클래스의 생성자

ThreadGroup(String name)
// 지정된 이름의 새로운 쓰레드 그룹을 생성한다.

ThreadGroup(ThreadGroup parent, String name)
// 지정된 쓰레드 그룹에 포함되는 새로운 쓰레드 그룹을 생성한다.

6. ThreadGroup 클래스의 메서드

int activeCount()
// 쓰레드 그룹에 포함된 활성상태에 있는 쓰레드의 수를 반환한다.
// 활성상태 = 작업 종료 전

int activeGroupCount()
// 쓰레드 그룹에 포함된 활성상태에 있는 쓰레드 그룹의 수를 반환한다.

void checkAccess()
// 현재 실행중인 쓰레드가 쓰레드 그룹을 변경할 권한이 있는지 체크한다.

void destroy()
// 쓰레드 그룹과 하위 쓰레드 그룹까지 모두 삭제한다. 단, 쓰레드 그룹이나 하위 쓰레드 그룹이 비어있어야 한다.

int enumerate(Thread[] list)
int enumerate(Thread[] list, boolean recurse)
int enumerate(ThreadGroup[] list)
int enumerate(ThreadGroup[] list, boolean recurse)
// 쓰레드 그룹에 속한 쓰레드 또는 하위 쓰레드 그룹의 목록을 지정된 배열에 담고 그 개수를 반환한다.
// recurse를 true로 하면 쓰레드 그룹에 속한 하위 쓰레드 그룹의 쓰레드 또는 쓰레드 그룹까지 배열로 담는다.

int getMaxPriority()
// 쓰레드 그룹의 최대 우선순위를 반환한다.

String getName()
// 쓰레드 그룹의 이름을 반환한다.

ThreadGroup getParent()
// 쓰레드 그룹의 상위 쓰레드 그룹을 반환한다.

void interrupt()
// 쓰레드 그룹에 속한 모든 쓰레드를 interrupt한다.

boolean isDaemon()
// 쓰레드 그룹이 데몬 쓰레드 그룹인지 확인한다.

boolean isDestroyed()
// 쓰레드 그룹이 삭제되었는지 확인힌다.

void list()
// 쓰레드 그룹에 속한 쓰레드와 하위 쓰레드 그룹에 대한 정보를 출력한다.

boolean parentOf(ThreadGroup g)
// 지정된 쓰레드 그룹의 상위 쓰레드 그룹인지 확인한다.

void setDaemon(boolean daemon)
// 쓰레드 그룹을 데몬 쓰레드 그룹으로 설정/해제한다.

void setMaxPriority(int pri)
// 쓰레드 그룹의 최대 우선순위를 설정한다.

void uncaughtException(Thread t, Throwable e) // 처리되지 않은 예외에 의해 쓰레드 그룹의
						// 실행이 종료되었을 때 JVM이 자동으로 호출하는 메서드