Thread는 애플리케이션(프로세스)의 실행에 있어서 가장 기본 단위이다. ( 프로세스는 무조건 하나이상의 스레드를 가진다.)

각 스레드마다 별도의 스택이 존재하며, 각 스레드는 같은 애플리케이션에 있는 다른 스레드와 독립적으로 돌아간다. 하지만 기본적으로 스레드끼리는 파일핸들이나, 메모리(Heap 영역등) 같은 자원을 공유한다.

따라서 공유되는 자원에 대해 접근을 제대로 제어하지 못하면 문제가 발생할 수 있다.

예를 들어서 동시에 두 스레드에서 같은 메모리 자원에 쓰기 작업을 할 때 데이터가 의도치 않는 값으로 변경되는 경우이다.

동시에 돌릴수 있는 스레드의 수는 컴퓨터에 있는 코어 개수로 제한되기 때문에, 운영체제는 각 스레등에 조금씩 시간을 나눠주면서 여러 스레드를 돌아가면서 실행시킨다.

운영체제에서 아무 때나 스레드 실행을 멈추고 다른 스레드를 실행 시킬 수 있기 때문에, 이러한 방법은 **선점형 스레딩 (Preemptive Threading)**이라고 한다. 이와 반대로 협력형 모델(Cooperative Model, 혹은 비선점형 스레딩(Non Preemptive Threading) )에서는 원래 실행중인 스레드에서 명시적으로 어떤 행동을 취해야만 다른 스레드를 실행시킬수 있다.

다른 스레드가 시작 될 수 있도록 한 스레드를 멈추는 것을 **컨텍스트 스위칭(Context Switching)**이라 한다.