자바에서 쓰레드를 나타내는 클래스이다. Thread 클래스에의 핵심 메소드로는 다음과 같은 메소드들이 있다.
Thread 클래스의 정적 메소드들은 적용 대상이 현재 진행중인 쓰레드이다.
쓰레드는 New, Runnable, Waiting, Timed Waiting, Terminated 총 다섯가지의 상태를 갖는다.
JVM이 시작되면 system이라는 쓰레드 그룹이 생성되고 이 하위 쓰레드 그룹으로 main 쓰레드 그룹이 생성된다. 여기에는 main 메소드를 실행하는 main 쓰레드가 포함된다.
새로운 쓰레드를 생성시 쓰레들 그룹을 지정할 수 있는데 만약 지정하지 않았다면 자신을 생성하는 쓰레드가 포함된 쓰레드 그룹에 속한다.
쓰레드 그룹에 추가하며 내부적으로 필요한 작업들을 한다.
쓰레드를 JVM이 실행시킨다.
3.1 start가 호출되면 JVM이 네이티브 메소드인 start0 메소드를 실행시킨며 쓰레드를 스케쥴러에 포함시킨다.
3.2 쓰레드는 쓰레드 큐에서 Runnable로 대기하다 자신의 차례가 오면 run 메소드를 호출하며 동작을 수행한다.
start를 호출하면 새로운 쓰레드를 생성하고 쓰레드가 사용할 스택을 생성한다.

run이 호출되면 run은 새로 생성된 쓰레드의 호출 스택에 쌓인다. 이렇게 쓰레드는 독립된 작업을 수행할 수 있다.

스케쥴러에 의해 호출 스택을 번갈아 가며 수행한다.
하지만 run을 단독 호출한다면 main 쓰레드에서 쓰레드를 생성한 경우 호출 스택이 생성되지 않아 단순히 main에서 메소드 호출하는 것처럼 작동한다.

public static void main(String[] args){
TestThread thread = new TestThread();
thread.start();
}
static class TestThread extends Thread{
@Override
public void run() {
System.out.println(Thread.currentThread().getName());
}
}
public static void main(String[] args) throws IOException{
TestRunnable runnable = new TestRunnable();
Thread thread = new Thread(runnable);
thread.start();
}
static class TestRunnable implements Runnable{
@Override
public void run(){
//작업
}
}
public static void main(String[] args) throws IOException{
Runnable runnable = new Runnable(){
@Override
public void run(){
//작업
}
};
Thread thread = new Thread(runnable);
thread.start();
}
public static void main(String[] args) throws IOException{
Thread thread = new Thread(() -> System.out.println());
thread.start();
}
이러한 이유로 Runnable을 사용하는 것이 권장된다.
하지만 Thread와 Runnable을 모두
이러한 이유로 자바에서 쓰레드를 쉽게 이용하기 여러 api들이 나왔다.
쓰레드는 크게 사용자 쓰레드와 데몬 쓰레드 두가지로 구분할 수 있다.
데몬 쓰레드는 다음과 같은 특징을 갖는다.