메인 스레드에서 다른 스레드를 생성해서 병렬로 작업을 실행할 수 있다.

Java에서 스레드는 객체로 생성되므로 클래스가 필요하다. Thread 클래스를 직접 객체화하는 방법과 Thread를 상속한 클래스를 객체화하는 방법이 있다.

Thread 클래스를 직접 객체화

Thread thread = new Thread(new Runnable() {
    @Override
    public void run() {
        // code...
    }
});

thread.start();

Java의 multi-thread 환경에서는 Heap 영역과 Method 영역을 공유하기 때문에, 공유 자원에 대한 동기화 문제를 신경써야 한다.

img.png

스레드의 개수가 CPU 코어의 수보다 많을 경우 어떤 스레드에게 CPU 제어권을 주어야 하는지 결정해야 하는데, 이를 스레드 스케줄링이라고 한다.

Java의 스레드 스케줄링은 주로 우선순위 방식과 라운드-로빈 방식이 사용되며, 전자는 개발자가 직접 특정 스레드에 대해서 우선순위를 부여할 수 있지만, 후자는 JVM에 의해 결정된다.

우선 순위 방식 스레드 스케줄링

우선 순위는 1에서부터 10까지 부여할 수 있으며, 숫자가 클수록 우선 순위가 높다. Thread의 setPriority() 메소드를 사용해서 부여할 수 있다. 메인 스레드는 기본적으로 NORM_PRIORITY (5)가 부여된다. 우선 순위가 높은 스레드일수록 Running 할 수 있는 기회가 많이 주어진다.

스레드 상태

Untitled

실행 상태의 스레드는 다시 실행대기 상태로 돌아갈 수 있고,

실행실행대기 상태를 번갈아가며 자신의 run() 메소드를 수행한다.

run() 메소드가 종료되면 스레드의 상태도 종료된다.