* 공부 정리일자 (2022년 8~12월)
- 책 : 명품 자바 에센셜
- 개인적으로 공부 및 복습하면서 정리한 내용입니다. (사진 제외)
* 목차
12장. 자바 스레드 기초
12.1 멀티태스킹
12.2 자바 스레드 만들기
12.3 스레드 종료
12.4 스레드 동기화
1. 복습 (중요 키워드 위주)
12) 12강. 자바 스레드 기초 (책 468p)
12.1) 멀티태스킹 (책 468p)
(1) 멀티태스킹(multi-tasking) 개념
- 여러 개의 작업(태스크)이 동시에 처리되는 것
(2) 멀티태스킹 프로그램 사례
(3) 스레드와 운영체제
* 스레드 (thread)
- 운영체제에 의해 관리되는 하나의 작업 혹은 태스크
- 스레드와 태스크(혹은 작업)은 바꾸어 사용해도 무관
* 멀티스레딩(multi-threading)
- 여러 스레드를 동시에 실행시키는 응용프로그램을 작성하는 기법
* 스레드 구성
- 스레드 코드
-- 작업을 실행하기 위해 작성한 프로그램 코드
-- 개발자가 작성
- 스레드 정보
-- 스레드 명, 스레드 ID, 스레드의 실행 소요 시간, 스레드의 우선 순위 등
-- 운영체제가 스레드에 대해 관리하는 정보
(4) 멀티태스킹과 멀티스레딩
* 멀티태스킹 구현 기술
- 멀티프로세싱(multi-processing)
- 하나의 응용프로그램이 여러 개의 프로세스를 생성하고, 각 프로세스가 하나의 작업을 처리하는 기법
- 각 프로세스 독립된 메모리 영역을 보유하고 실행
- 프로세스 사이의 문맥 교환에 따른 과도한 오버헤드와 시간 소모의 문제점
* 멀티스레딩(multi-threading)
- 하나의 응용프로그램이 여러 개의 스레드를 생성하고, 각 스레드가 하나의 작업을 처리하는 기법
- 하나의 응용프로그램에 속한 스레드는 변수 메모리, 파일 오픈 테이블 등 자원으로 공유하므로, 문맥 교환에 따른 오버헤드가 매주 작음
- 현재 대부분의 운영체제가 멀티스레딩을 기본으로 하고 있음
* 웹 서버의 멀티스레딩 사례
(5) 자바 스레드(Thread)와 JVM
* 자바 스레드
- 자바 가상 기계(JVM)에 의해 스케쥴되는 실행 단위의 코드 블럭
- 스레드의 생명 주기는 JVM에 의해 관리됨 : JVM은 스레드 단위로 스케쥴링
* JVM과 자바의 멀티스레딩
- 하나의 JVM은 하나의 자바 응용프로그램만 실행
-- 자바 응용프로그램이 시작될 때 JVM이 함께 실행됨
-- 자바 응용프로그램이 종료하면 JVM도 함께 종료함
- 응용프로그램은 하나 이상의 스레드로 구성 가능
12.2) 자바 스레드 만들기 (책 473p)
* 스레드 만드는 2 가지 방법
- java.lang.Thread 클래스를 상속받아 스레드 작성
- java.lang.Runnable 인터페이스를 구현하여 스레드 작성
(1.1) Thread 클래스를 상속받아 스레드 만들기 (1)
- Thread 클래스의 주요 메소드
(1.2) Thread 클래스를 상속받아 스레드 만들기 (2)
* Thread를 상속받아 run() 오버라이딩
- Thread 클래스 상속. 새 클래스 작성
- run() 메소드 작성
-- run() 메소드를 스레드 코드라고 부름
-- run() 메소드에서 스레드 실행 시작
* 스레드 객체 생성
- 생성된 객체는 필드와 메소드를 가진 객체일 뿐 스레드로 작동하지 않음
* 스레드 시작
- start() 메소드 호출
-- 스레드로 작동 시작
-- 스레드 객체의 run()이 비로소 실행
-- JVM에 의해 스케쥴되기 시작함
* Thread를 상속받아 1초 단위로 초 시간을 출력하는 TimerThread 스레드 작성 사례
* 예제 12-1 : Thread를 상속받아 1초 단위 타이머 스레드 만들기
(2) Runnable 인터페이스로 스레드 만들기
* Runnable 인터페이스 구현하는 새 클래스 작성
- run() 메소드 구현
-- run() 메소드를 스레드 코드라고 부름
-- run() 메소드에서 스레드 실행 시작
* 스레드 객체 생성
* 스레드 시작
- start() 메소드 호출
-- 스레드로 작동 시작
-- 스레드 객체의 run()이 비로소 실행
-- JVM에 의해 스케쥴되기 시작함
* 예제 12-2 : Runnable 인터페이스를 이용하여 1초 단위로 출력하는 타이머 스레드 만들기
(3) main 쓰레드
* JVM이 응용프로그램을 실행할 때 디폴트로 생성되는 스레드
- main() 메소드 실행 시작
- main() 메소드가 종료하면 main 스레드 종료
* 예제 12-3 : main 스레드 확인과 스레드 정보를 알아내는 코드
- main() 메소드 내에서
현재 스레드 정보를 가진 Thread 객체를 알아내어 현재 실행중인 스레드에 관한 다양한 정보를 출력한다.
12.3) 스레드 종료 (책 481p)
(1) 스레드 종료와 타 스레드 강제 종료
* 스스로 종료
- run() 메소드 리턴
* 타 스레드에서 강제 종료
- interrupt() 메소드 사용
* 예제 12-4 : 진동하는 스레드와 스레드의 강제 종료
- Runnable을 받은 스레드를 작성하여 프레임이 심하게 진동하도록 프로그램을 작성하라.
- 그리고 컨텐트팬에 마우스를 클릭하면 진동 스레드를 종료시켜 진동이 멈추도록 하라
* 예제 12-4 정답
12.4) 스레드 동기화 (책 484p)
(1) 스레드 동기화 (Thread Synchronization)
* 멀티스레드 프로그램 작성시 주의점
- 다수의 스레드가 공유 데이터에 동시에 접근하는 경우
-- 공유 데이터의 값에 예상치 못한 결과 발생 가능
* 스레드 동기화
- 동기화란?
-- 스레드 사이의 실행순서 제어, 공유데이터에 대한 접근을 원활하게 하는 기법
- 멀티스레드의 공유 데이터의 동시 접근 문제 해결
방법1) 공유 데이터를 접근하는 모든 스레드의 한 줄 세우기
방법2) 한 스레드가 공유 데이터에 대한 작업을 끝낼 때까지 다른 스레드가 대기 하도록 함
* 자바의 스레드 동기화 방법 - 2가지
- synchronized 키워드로 동기화 블록 지정
- wait()-notify() 메소드로 스레드의 실행 순서 제어
* 동기화의 필요성 - 두 스레드가 프린터에 동시 쓰기로 충돌하는 경우
(2) 자바 스레드 동기화를 위한 synchronized 블록 지정
* synchronized 키워드
- 스레드가 독점적으로 실행해야 하는 부분(동기화 코드)을 표시하는 키워드
-- 임계 영역(criitical section) 표기 키워드
- synchronized 블록 지정 방법
-- 메소드 전체 혹은 코드 블록
* synchronized 블록이 실행될 때,
- 먼저 실행한 스레드가 모니터 소유
-- 모니터란 해당 객체를 독점적으로 사용할 수 있는 권한
- 모니터를 소유한 스레드가 모니터를 내놓을 때까지 다른 스레드 대기
* 예제 12-5 : 두 스레드가 공유 프린터 객체를 통해 동시에 출력하는 경우 동기화 - synchronized 블록 지정
* 예제 12-5 실행 결과
(3) wait()-notify()를 이용한 스레드 동기화
* wait()-notify()가 필요한 경우
- 공유 데이터로 두 개 이상의 스레드가 데이터를 주고 받을 때
-- producer-consumer문제
* 동기화 메소드
- wait() : 다른 스레드가 notify()를 불러줄 때까지 기다린다.
- notify() : wait()를 호출하여 대기중인 스레드를 깨운다.
-- wait(), notify()는 Object의 메소드
* 예제 12-6 : wait(), notify()를 이용한 바 채우기
- 다음 설명과 같이 작동하는 스윙 프로그램을 작성하라.
아래 그림에는 스레드를 가진 bar가 있다.
아무 키나 누르면 bar에 마젠타색이 오른쪽으로 1/100씩 채워진다.
가만히 있으면
스레드에 의해 0.1초 간격으로 bar의 마젠타색을 1/100씩 감소시킨다.
키를 빨리 누르지 않으면 스레드의 감소 속도를 이기지 못한다.
bar는 JLabel을 상속받은 MyLabel로 작성하고
MyLabel의 paintComponent() 메소드가
bar를 마젠타색으로 채우도록 하라.
* 예제 12-6 정답
'프로그래밍 공부 > Java' 카테고리의 다른 글
[ Java 프로그래밍 ] 공부 정리 - 10강. 스윙 컴포넌트 활용 (0) | 2023.04.30 |
---|---|
[ Java 프로그래밍 ] 공부 정리 - 9강. 자바의 이벤트 처리 (0) | 2023.04.30 |
[ Java 프로그래밍 ] 공부 정리 - 8강. 자바 GUI 스윙 기초 (0) | 2023.04.30 |
[ Java 프로그래밍 ] 공부 정리 - 6강. 모듈과 패키지 개념, 자바 패키지 활용 (0) | 2023.04.30 |
[ Java 프로그래밍 ] 공부 정리 - 5강. 상속 (0) | 2023.04.30 |