운영체제로부터 자원을 할당받는 자원의 단위
OS가 프로그램 실행을 위한 프로세스를 할당해줄 때 프로세스 안에 code, data, memory(heap,stack)을 함께 할당해준다.
new
프로세스가 할당받은 자원을 이용하는 실행의 단위
프로세스가 작업중인 프로그램에서 실행 요청이 들어오면 쓰레드를 만들어 명령을 처리
프로세스 안에 있는 메모리 공간(Heap)을 공유받고, 자신만의 메모리 공간(Stack)도 할당받는다.
일반 쓰레드와 동일하며, JVM 프로세스 안에서 실행되는 쓰레드를 말한다.
Java 프로그램 쓰레드는 Java Main 쓰레드부터 실행되며, JVM에 의해 실행된다.
프로세스 안에서 하나의 쓰레드만 실행되는 것
→ Java 프로그램의 경우 main() 메서드만 실행시켰을 때 (메인 쓰레드)
프로세스 안에서 여러 개의 쓰레드가 실행되는 것
context switching : 쓰레드 간의 작업 전환
멀티 쓰레드로 작업을 하면 동시에 작업하는 것 처럼 보이지만, 매우 빠른 속도로 번갈아 작업이 이루어진다.
이 시간때문에 두 개의 쓰레드로 작업한 시간이 싱글 쓰레드로 작업한 시간보다 더 걸리게 된다.
만약 싱글 코어에서 단순히 CPU만을 사용하는 작업이라면 싱글 쓰레드로 프로그래밍하는 것이 더 효율적이다.
🔺 쓰레드의 작업 순서는 매번 달라질 수 있다.
JVM의 쓰레드 스케줄러에 의해서 작업 순서가 결정되는 데 프로세스의 작업 순서는 OS의 스케줄러에 의해 결정되기 때문이다.
JAVA가 OS 독립적이라고 하지만 OS 종속적인 부분이 존재하는데 그 중 하나가 쓰레드이다.
두 쓰레드가 서로 다른 자원을 사용하는 작업의 경우에는 싱글 쓰레드 프로세스보다 멀티쓰레드 프로세스가 더 효율적이다.
예를 들어 사용자의 입력이 필요한 경우 싱글 쓰레드라면 입력을 기다리는 동안 다른 작업을 할 수 없다. 그러나 멀티쓰레드라면 입력을 기다리는 동안 다른 쓰레드가 작업을 할 수 있다.
쓰레드가 입출력(I/O) 처리를 위해 기다리는 것을 I/O blocking 이라고 한다.