서론:
Thread 클래스를 상속하거나 Runnable 인터페이스를 구현하는 방법 외에 run() 메서드를 재정의해야 합니다. 이 run() 메서드 내에서 발생하는 예외는 try...catch 를 통해만 처리할 수 있으며, 예외를 상위로 던jar는 것은 불가능합니다. 이는因為 run() 메서드가 예외를 던질 수 없도록 설계되었기 때문입니다.
이번 기고에서는 멀티스레드 학습 과정에서 반드시 알아야 할 9가지 방법에 대해 설명하고 핵심 지식을巩튼히 다져보겠습니다;
1. currentThread() - 현재 실행 중인 스레드 객체 가져오기
Thread.currentThread() 메서드는 현재 실행 중인 스레드 객체를 반환합니다. 코드가 여러 스레드에서 실행될 때, 이 메서드는 실제로 실행 중인 스레드 객체를 제공합니다.
2. setName()/getName() - 스레드 이름 설정/ 가져오기
thread.setName() 메서드: 스레드 이름 설정 thread.getName() 메서드: 스레드 이름 가져오기
다른 스레드를 구별하기 위해 thread.setName()을 통해 이름을 설정하고, thread.getName()을 통해 설정된 이름을 가져올 수 있습니다.
3. isAlive() - 스레드 활성 상태 확인
thread.isAlive() 메서드는 현재 실행 중인 스레드가 시작된 후 멈지지 않았는지 여부를 검사합니다.
4. sleep() - 스레드 수면
Thread.sleep(millis) 메서드는 현재 실행 중인 스레드를 지정된 밀리초 동안 수면상태로 만듭니다.
5. getId() - 스레드 고유 식별자 ID 가져오기
각 스레드는 고유한 식별자 ID를 가지고 있습니다. Thread.currentThread().getId()를 통해 현재 스레드의 고유 ID를 반환할 수 있습니다. 이 스레드가 실행 종료 후, 이 ID는 다른 스레드에게 재할당될 수 있습니다.
6. yield() - CPU 자원 양보
각 스레드는 CPU 실행권을 확보해야 합니다. Thread.yield() 메서드는 현재 스레드가 CPU 자원을 양보하도록 합니다.
7. setPriority() - 스레드 우선순위 설정
thread.setPriority(num) 메서드는 스레드의 우선순위를 설정합니다. 우선순위는 1에서 10 사이의 값을 가지며, 값이 클수록 우선순위가 높습니다. 값이 이 범위를 벗어날 경우 IllegalArguumentException 예외가 발생합니다. 우선순위가 높은 스레드는 더 많은 CPU 자원을 할당받을 수 있지만, 우선순위가 높은 스레드가 항상 먼저 실행되는 것은 보장되지 않습니다.
스레드 배고픔: 스레드 우선순위 설정이 부적절할 경우 일부 스레드는 영구적으로 실행되지 못하는 상황이 발생합니다. 이른바 '스레드 배고픔' 현상입니다. 우선순위는 항상 높을수록 좋지 않습니다. 보통은 기본 우선순위(5)를 사용하는 것이 좋습니다. 우선순위는 상속적입니다. A 스레드가 B 스레드를 생성하면, B 스레드는 A 스레드와 동일한 우선순위를 가지게 됩니다.
8. interrupt() - 중단 마크 설정
thread.interrupt() 메서드는 스레드에 중단 마크를 설정합니다. 이는 스레드를 즉시 중단하는 것이 아니라, 스레드가 중단 상태를 체크할 수 있도록 합니다. this.isInterrupted()를 통해 중단 마크 여부를 확인하고, 중단되면 return을 통해 메서드 실행을 중단시킬 수 있습니다.
다음은 테스트 예제입니다:
public class MyThread extends Thread {
@Override
public void run() {
for (int i = 0; i < 10; i++) {
if (this.isInterrupted()) {
System.out.println("스레드가 중단 마크가 설정되었습니다.");
return;
}
System.out.println(this.getName() + "실행 중: " + i);
}
}
}
public class ThreadTest {
public static void main(String[] args) {
MyThread myThread = new MyThread();
myThread.start();
for (int i = 0; i < 10; i++) {
System.out.println("메인 스레드 실행 중: " + i);
}
// myThread.interrupt(); // 주석 해제 시 MyThread가 중단됩니다.
}
}
9. setDaemon() - 보호자 스레드 설정
스레드는 사용자 스레드와 보호자 스레드로 나눌 수 있습니다.
보호자 스레드: 다른 스레드를 위해 서비스를 제공하는 스레드입니다._GC(가bage Collector)는 대표적인 보호자 스레드입니다. 보호자 스레드는 JVM 내에서 독립적으로 실행할 수 없습니다. 모든 사용자 스레드가 종료되면 보호자 스레드가 자동으로 소멸되고 JVM이 종료됩니다.
thread.setDaemon(true); // thread를 보호자 스레드로 설정