※ 멀티태스킹(multi-tasking) 이란?
- 멀티태스킹(multi-tasking)
- => 하나의 응용프로그램이 여러 개의 작업(태스크)을 동시에 처리
- 멀티태스킹 응용프로그램 사례
- 미디어 플레이어(오디오, 비디오 .. 등), 테트리스 게임(오디오, 블록동작 ... 등)
※ 테트리스 프로그램을 구성하는 멀티스레드 분석

- JVM은 3 개의 스레드 중 하나를 선택하여 실행시킨다.
- 예를 들어 스레드 A를 선택하면 스 레드의 A의 코드(사용자가 작성한 코드)를 호출한다.
- 스레드 A를 일시 중단하고, JVM이 스 레드 B를 실행시켜려면 다시 스레드 B의 코드(사용자가 작성한 코드)를 호출한다.
- 마치 바늘이 하나의 실(thread) 을 가지고 바느질하는 것과 자바의 스레드는 일맥 상통함
※ 스레드와 멀티스레딩
- 스레드
- 사용자가 작성한 코드로서, JVM에 의해 스케줄링되어 실행되는 단위
- 자바의 멀티태스킹
- 멀티스레딩만 가능
- 스레드는 JVM의 의한 실행 단위, 스케쥴링 단위
- 멀티스레딩만 가능
- 멀티스레딩의 효과
- 한 스레드가 대기하는 동안 다른 스레드 실행
- 프로그램 전체적으로 시간 지연을 줄임
※ 웹 서버의 멀티스레딩 사례

※ 자바 스레드(Thread) 란?
- 자바 스레드
- 자바 가상 기계(JVM)에 의해 스케쥴되는 실행 단위의 코드 블럭
- 스레드의 생명 주기는 JVM에 의해 관리됨
- JVM은 스레드 단위로 스케쥴링
- JVM과 멀티스레드의 관계
- 하나의 JVM은 하나의 자바 응용프로그램만 실행
- 자바 응용프로그램이 시작될 때 JVM이 함께 실행됨
- 자바 응용프로그램이 종료하면 JVM도 함께 종료함
- 하나의 응용프로그램은 하나 이상의 스레드로 구성 가능
- 하나의 JVM은 하나의 자바 응용프로그램만 실행
※ JVM과 자바 응용프로그램, 스레드의 관계

- 두 개의 자바 응용프로그램을 동시에 실행시키고자 하면
- 두 개의 JVM을 이용하고 응용프로그램은 서로 소켓 등을 이용하여 통신
※ 자바 스레드와 JVM

- 각 스레드의 스레드 코드는 응용프로그램 내에 존재함
- 현재 하나의 JVM에 의해 4 개의 스레드가 실행 중이며 그 중 스레드 2가 JVM에 의해 스케쥴링되어 실행되고 있음
※ 자바에서 스레드 만들기
- 스레드 실행을 위해 개발자가 하는 작업
- 스레드 코드 작성
- 스레드를 생성하고 스레드 코드를 실행하도록 JVM에게 요청
- 스레드 만드는 2 가지 방법
- java.lang.Thread 클래스를 이용하는 경우
- java.lang.Runnable 인터페이스를 이용하는 경우
※ Thread 클래스를 이용한 스레드 생성
- 스레드 클래스 작성
- Thread 클래스 상속. 새 클래스 작성
- class TimerThread extends Thread {}
- 스레드 코드 작성
- run() 메소드 오버라이딩
- run() 메소드를 스레드 코드라고 부름
- run() 메소드에서 스레드 실행 시작
- public void run() { // run() 오버라이딩
- run() 메소드 오버라이딩
- 스레드 객체 생성
- TimerThread th = new TimerThread();
- 스레드 시작
- start() 메소드 호출
- 스레드로 작동 시작, JVM에 의해 스케쥴되기 시작함
- th.start();
- start() 메소드 호출
※ 스레드 만들 때 주의 사항
- run() 메소드가 종료하면 스레드는 종료한다
- 스레드가 계속 살아있게 하려면 run() 메소드 내 무한루프 작성
- 한번 종료한 스레드는 다시 시작시킬 수 없다
- 다시 스레드 객체를 생성하고 start()를 호출해야 함
- 한 스레드에서 다른 스레드를 강제 종료할 수 있다