Java Adv 02 - Thread 2
in Programming Language on Java
스레드 기본정보
package thread.control;
import static util.MyLogger.log;
public class ThreadInfoMain {
public static void main(String[] args) {
//mainThread
Thread mainThread = Thread.currentThread();
log( "mainThread() = " + mainThread );
log( "mainThread.thread() = " + mainThread.threadId() );
log( "mainThread.getName() = " + mainThread.getName() );
log( "mainThread.getPriority() = " + mainThread.getPriority() );
log( "mainThread.getThreadGroup() = " + mainThread.getThreadGroup() );
log( "mainThread.getState() = " + mainThread.getState() );
Thread myThread = new Thread( new HelloRunnable() );
log( "myThread() = " + myThread );
log( "myThread.thread() = " + myThread.threadId() );
log( "myThread.getName() = " + myThread.getName() );
log( "myThread.getPriority() = " + myThread.getPriority() ); //기본값이 5
log( "myThread.getThreadGroup() = " + myThread.getThreadGroup() );
log( "myThread.getState() = " + myThread.getState() ); //NEW
}
}
스레드 생성
스레드를 생성할 때는 실행할 Runnable 인터페이스의 구현체와, 스레드의 이름을 전달할 수 있다.
Thread myThread = new Thread(new HelloRunnable(), "myThread");
- Runnable 인터페이스 : 실행할 작업을 포함하는 인터페이스이다.
- HelloRunnable 클래스는 Runnable 인터페이스를 구현한 클래스이다.
- Thread() 스레드 아이디는 중복이 허용되지 않는다. 유일한 식별자 이기 때문이다. 이 ID는 JVM내에서 각 스레드에 대해서 유일하다. ID는 스레드가 생성될 때 할당되며, 직접 지정할 수는 없다.
- getName() 스레드 이름을 반환하는 메서드이다. “myThread”라는 이름을 지정하면 이 값이 반한된다. 스레드 ID는 중복을 허용하지 않지만, 이름은 중복을 허용한다.
- 스레드 우선순위 : 우선순위를 반환하는 메서드이다 → CPU스케줄링에서 먼저처리해야 할 부분들에 대해서 우선순위를 지정할 수 있다. → 우선순위는 가장 낮음 1과 가장 높음 10으로 설정되는데 지정해주지 않으면 기본 값인 5가 지정된다. → 1과 10의 사이인 5가 기본값으로 설정되는듯 하다.
- 우선순위는 스레드 스케줄러가 어떤 스레드를 우선 실행할지 결정하는 데 사용한다. 하지만 실제 실행 순서는 JVM구현과 운영체제에 따라서 달라질 수 있다.
- 스레드 그룹 → 스레드는 그룹으로 소속된다. 기본적으로 모든 스레드는 부모 스레드와 동일한 그룹으로 설정된다.
- 부모 스레드 : 새로운 스레드를 생성하는 스레드를 의미한다. 예를들어 myThread는 mainThread에 의해서 생성되었으므로 mainThread가 부모스레드이며, myThread도 mainThread에 소속하게 된다.
스레드의 상태
- NEW
- Runnable : 실행 중이거나 실행될 준비가 된 상태
- 일시 중지 상태
- Blocked
- Waiting
- Timed Waiting
- Terminated(종료상태)
new(새로운 상태)
- 스레드가 생성되고 아직 시작되지 않은 상태
- 이 상태에서는 Thread객체가 생성되지만 start()메서드는 호출되지 않은 상태이다.
Runnable(실행 가능 상태)
- 스레드가 실행될 준비가 된 상태 이 상태에서는 스레드는 실제로 CPU에서 실행될 수 있다.
- start()메서드가 호출되면 스레드는 이 상태로 들어간다.
- Runnable상태에 있는 모든 스레드가 동시에 실행되는 것은 아니다. 운영체제의 각 스레드에 CPU 시간을 할당하여 실행하기 때문에 스레드는 스케줄러의 실행 대기열에 포함되어 있다가 차례로 CPU에서 실행된다.
- 스케줄러의 실행 대기열에 있든, CPU에서 실제 실행이 되고 있든 모두
Runnable상태이다.- 보통 실행 상태라고 부른다.
Blocked(차단 상태)
- 스레드가 다른 스레드에 의해 동기화 락을 얻기 위해 기다리는 상태이다.
- synchronized 블록에 진입하기 위해 락을 얻어야 하는 경우 이 상태에 들어간다.
- 다른 스레드가 lock을 가지고 있으면 다시 lock이 돌아올 때 까지 기다려야 한다.
Waiting(대기 상태)
- 스레드가 다른 스레드의 특정 작업이 완료되그를 무기한 기다리는 상태이다.
- wain(), join() 메서드가 호출될 때 이상태가 된다.
- 스레드는 다른 스레드가 notify(), or notifyAll() 메서드를 호출하거나, join()이 완료될 때까지 기다린다.
Timed Waiting(시간 제한 대기 상태)
- 스레드가 특정 시간 동안 다른 스레드의 작업이 완료되기를 기다리는 상태이다.
- sleep(long millis), wait()long timeout), join(long milis) 메서드가 호출될 때 이상태가 된다.
- 주어진 시간이 경과하거나, 다른 스레드가 해당 스레드를 깨우면 이 상태에서 벗어난다.
- Thread.sleep(1000)
Terminated(종료 상태)
- 스레드가 실행이 완료된 상태이다.
- 스레드가 정상적으로 종료되거나, 예외가 발생하여 종료된 경우 이 상태로 돌아간다.
- 스레드는 한 번 종료되면 다시 시작할 수 없다.
- Sleep을 하면 체크예외가 터진다.
Reference
인프런 김영한님의 자바강좌 + 나의 뇌