하나의 애플리케이션 안에서 두 개 이상의 작업을 동시에 병렬 처리하는 스레드(Thread)와 멀티태스킹 및 동기화 기술을 배웁니다.
1. 스레드 핵심 용어 사전 (Glossary)
- Thread (스레드): 프로세스 내부에서 독립적으로 실행되는 제어 흐름의 최단 단위입니다.
- Runnable Interface: 스레드가 실행할 작업 내용(
run()메소드)만 분리하여 선언하는 함수형 인터페이스입니다. - Thread State (스레드 상태):
NEW(생성) $ ightarrow$RUNNABLE(실행가능) $ ightarrow$WAITING/TIMED_WAITING(대기) $ ightarrow$TERMINATED(종료) - Critical Section (임계 영역): 둘 이상의 스레드가 동시 접근할 때 데이터 꼬임이 발생하는 공유 자원 영역입니다.
- synchronized: 한 스레드가 임계 영역을 실행하는 동안 다른 스레드의 접근을 차단하는 모니터 락 키워드입니다.
2. synchronized 동기화 처리 실습
class SharedPrinter {
// 동기화 메소드로 1번에 1개 스레드만 텍스트 출력 허용
public synchronized void printNotice(String user, String text) {
System.out.print("[" + user + "]: ");
for (int i = 0; i < text.length(); i++) {
System.out.print(text.charAt(i));
try { Thread.sleep(50); } catch (InterruptedException e) {}
}
System.out.println();
}
}
public class MultiThreadSyncMain {
public static void main(String[] args) {
SharedPrinter printer = new SharedPrinter();
Thread t1 = new Thread(() -> printer.printNotice("사용자 A", "안녕하세요! 동기화 테스트입니다."));
Thread t2 = new Thread(() -> printer.printNotice("사용자 B", "반갑습니다! 멀티스레드입니다."));
t1.start();
t2.start();
}
}
3. 자주 묻는 질문 (Q&A)
Q. thread.start() 대신 thread.run()을 호출하면 어떻게 되나요?
A. start()는 새로운 독립 스레드를 생성하여 병렬로 run()을 실행하지만, run()을 직접 부르면 새 스레드가 생성되지 않고 현재 호출한 메인 스레드 상에서 단순 메소드로만 실행됩니다.