- 일반적으로 CPU에 의해 메모리에 올려져 실행중인 프로그램을 의미
- 자신만의 메모리 공간을 포함한 독립적 실행 환경을 가짐
- JVM은 주로 하나의 프로세스로 실행되며, 동시에 여러 작업을 수행하기 위해 멀티 스레드를 지원
- 프로세스 안에서 실질적으로 작업을 실행하는 단위
- 프로세스는 적어도 한개 이상의 스레드를 가지며, Main 스레드로 시작해 스레드를 추가 생성하게 되면 멀티 스레드 환경을 가지게 됨
JVM은 주로 하나의 프로세스로 실행되며 동시에 여러 작업을 수행하기 위해 멀티 스레드를 지원합니다.
우선 모든 자바 프로그램은 메인 스레드가 main() 메소드를 실행하면서 시작됩니다.

메인 스레드는 필요에 따라 추가 작업 스레드들을 만들어서 실행시킬 수 있습니다.
이렇게 생성된 멀티 스레드에서는 실행 중인 스레드가 하나라도 있다면 프로세스는 종료되지 않습니다.
자바에서 작업 스레드는 "객체"로 관리하므로 클래스가 필요하고 Thread 클래스로 직접 객체를 생성하거나, 자식 클래스를 만들어 생성할 수 있습니다.
java.lang 패키지 > Thread 클래스
Runnable 구현 객체를 매개값으로 갖는 생성자 호출
Thread thread = new Thread(Runnable target);
Runnable은 스레드가 작업을 실행할 때 사용하는 인터페이스입니다.
구현 클래스는 Runnable에 정의된 run() 메소드를 재정의해서 스레드가 실행할 코드를 작성합니다.
class Task implements Runnable {
@Override
public void run() {
// 스레드가 실행할 코드
}
}
Runnable 구현 객체를 생성한 후 Thread 생성자 매개값으로 Runnable 객체를 전달
Runnable task = new Task();
Thread thread = new Thread(task);
자주 사용되는 방법은 Runnable 구현 클래스를 작성하지 않고 Thread 생성자를 호출할 때 Runnable 익명 구현 객체를 매개값으로 사용합니다.
Thread thread = new Thread(new Runnable() {
@Override
public void run() {
// 스레드가 실행할 코드
}
});
스레드 객체의 start() 메소드를 호출하여 작업 스레드를 실행합니다.
thread.start();
💡 중요
작업 스레드 실행 순서
작업 스레드 객체 생성->start() 메소드 호출->run() 메소드 내에 작성된 작업 실행
Thread 클래스를 상속한 다음 run() 메소드를 재정의해서 스레드가 실행할 코드를 작성하고 객체를 생성합니다.
public class SubThread extends Thread {
@Override
public void run() {
// 스레드가 실행할 코드
}
}
// 스레드 객체 생성
Thread thread = new SubThread();
명시적인 자식 클래스를 정의하지 않고, Thread 익명 자식 객체를 사용하는 방법이 더 자주 사용됩니다.
Thread thread = new Thread() {
@Override
public void run() {
// 스레드가 실행할 코드
}
};
thread.start();