쓰레드는 프로그램의 실행 흐름을 나타내는 가장 작은 단위로, 쓰레드는 프로세스 내에서 실행될 수 있는 여러개의 작업(코드 실행) 중 하나로, 각 쓰레드는 독립적으로 처리되지만 같은 프로세스 내에 있는 여러 쓰레드가 자원을 공유할 수 있다.
java에서는 Thread 클래스를 상속받거나, Runnable 인터페이스를 구현하여 생성 가능하다.
class MyThread extends Thread {
public void run() {
System.out.println("Thread is running");
}
}
public class Main {
public static void main(String[] args) {
MyThread thread = new MyThread();
thread.start(); // 쓰레드를 실행
}
}

try {
threadB.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
- main메서드에서 스레드 B를 호출하여 join하여
스레드 B가 종료될때 까지 메인 스레드를 대기 상태로 만듬
synchronized (sharedObject) {
while (conditionNotMet) {
sharedObject.wait(); // 현재 쓰레드를 대기 상태로 변환
}
}
synchronized (sharedObject) {
conditionNotMet = false; // 조건을 충족하는 예시
sharedObject.notify(); // 대기 중인 스레드 중
//하나를 깨움
}
- 이 상태의 쓰레드는 자신을 대기시키는 쓰레드가 특정 조건을 만족할
때 까지 실행을 멈추고 대기한다.
- 조건이 충족되면 notify()로 알려서 깨움
멀티 스레드는 하나의 프로그램을 여러 실행 단위로 쪼개 실행한다는 측면에서 다중 처리와 의미가 비슷하지만, 동일 프로세스의 스레드들은 서로 자원을 공유하며 자원 생성과 관리의 중복성을 최소화 한다는 점에서 차이가 있다.
또한 각 스레드는 커널의 개입 없이 독립적으로 실행할 수있어 서버에서 많은 요청을 효과적으로 처리 가능
데몬 스레드는 일반 스레드와 달리, 주로 백그라운드에서 실행되는 스레드이다
프로그램의 주요 작업을 지원하지만, 주 작업 스레드가 종료되면 함께 종료된다.
Thread daemonThread = new Thread(() -> {
// 스레드 작업
});
daemonThread.setDaemon(true); // 데몬 스레드로 설정
daemonThread.start();