1. 스레드 (Thread)
용어 설명
- 스레드 (Thread) : 프로그램에서 명령을 실행하기 위한 최소의 작업 단위
- 프로세스 (Process) : 메모리에 저장된 프로그램
=> 중앙처리장치에 의해 실행되기 위한 명령
=> 메모리에 저장된 프로그램
- 단일 스레드 프로그램 : JVM에 의해 생성된 main 스레드를 이용하여 main() 메소드를 호출하여 명령 실행
=> main() 메소드가 종료되면 main 스레드는 자동 소멸 -> 프로그램 종료
2. 스레드 기초
- 객체를 생성하여 메소드를 호출한 경우 스레드가 메소드로 이동하여 메소드의 명령 실행
- 다중 스레드 프로그램 : 프로그램 개발자가 직접 스레드를 생성하여 다수의 명령을 동시에 실행되도록 만든 프로그램
=> 프로그램의 모든 스레드가 소멸돼야만 프로그램 종료
- GUI 프로그램 및 Web 프로그램 등은 다중 스레드 프로그램으로 작성
3. Thread 클래스
1. Thread 클래스
- Thread 클래스 : 스레드 관련 정보를 저장하여 스레드 관련 제어 기능을 메소드로 제공하기 위한 클래스
- Thread 클래스로 직접 객체를 생성하여 start() 메소드 호출시 새롭게 생성된 스레드는 Thread 객체의 명령이 없는 run() 메소드 호출되어 무의미
- 하나의 Thread 객체는 하나의 스레드만 생성 가능
=> Thread 객체를 사용하여 start() 메소드를 여러번 호출할 경우IllegalThreadStateException 예외 발생
2. Thread. 매소드
- Thread.currentThread() : 현재 명령을 읽어 스레드에 대한 Thread 객체를 반환하는 메소드
- Thread.getName() : Thread 객체에 저장된 스레드의 이름을 반환하는 메소드
- Thread.start() : Thread 객체로 새로운 스레드를 생성하기 위한 메소드
4. 실행
프로그램 개발자가 스레드를 생성하여 명령을 실행하는 방법-1 : Thread 클래스 이용
- Thread 클래스를 상속받은 자식클래스 작성
- Thread 클래스를 상속받은 자식클래스에서 run() 메소드 오버라이드 선언
=> run() 메소드에는 프로그램 개발자에 의해 생성된 스레드가 실행하기 위한 명령 작성
- Thread 클래스를 상속받은 자식클래스로 객체 생성
=> Thread (부모클래스) 객체 생성
- Thread 객체로 start() 메소드 호출
=> Thread 객체를 이용하여 새로운 스레드 생성
=> 생성된 스레드는 자종으로 Thread 객체의 run() 메소드를 호출하여 run() 메소드의 명령 실행
프로그램 개발자가 스레드를 생성하여 명령을 실행하는 방법-2 : Runnable 인터페이스 이용
- 클래스가 이미 다른 클래스를 상속받아 Thread 클래스를 상속받지 못하는 경우 Runnable 인터페이스를 상속받아 새로운 스레드를 생성하는 방법
- 방법-1을 권장
- Thread 클래스를 상속받은 자식클래스 작성
- Thread 클래스를 상속받은 자식클래스에서 run() 메소드 오버라이드 선언
=> run() 메소드에는 프로그램 개발자에 의해 생성된 스레드가 실행하기 위한 명령 작성
- Thread 클래스로 Thread 객체를 생성 - Thread 클래스의 생성자 중 매개변수에 Runnable 인터페이스를 상속받은 자식클래스의 객체를 전달하여 Thread 객체를 생성하는 생성자 호출
- Thread 객체로 start() 메소드 호출
5. 다중 스레드 프로그램의 문제점
- 다수의 스레드가 run() 메소드의 명령을 실행할 경우 같은 객체의 메소드를 호출하여 필드값을 변경할 경우 잘못된 처리 결과 발생 가능
** 해결법 : 스레드 동기화를 이용하여 스레드에 대한 메소드 호출 제어
6. 스레드 동기화 (Thread Synchronize)
1. 스레드 동기화 (Thread Synchronize)
- 스레드 동기화 (Thread Synchronize) : 스레드에 의해 메소드 호출시 메소드의 모든 명령을 실행하기 전까지 다른 스레드로 메소드를 호출하지 못하도록 방지하는 기능
- 다른 스레드가 이미 메소드를 호출하여 실행중인 경우 스레드를 일시 중지하여 기존 스레드의 메소드 처리가 끝난 후 일시 중지된 스레드가 실행되도록 락 (Lock) 기능 제공
2. 스레드 동기화 처리 방법
- synchronized 키워드를 사용하여 메소드 선언
=> 동기화 메소드 (Synchronized Method)
=> 메소드 수정이 가능할 때 사용
접근제한자 synchronized 반환형 메소드명 (자료형 매개변수, ...) {
명령;
፧
}
- synchronized 키워드로 블럭을 설정하여 메소드를 호출
=> synchronized 영역의 객체로 호출되는 모든 메소드는 동기화 처리되어 실행
synchronized (객체) {
객체.메소드명(값, ...);
፧
}