JAVA

[java] 명품자바 13장 - 스레드와 멀티태스킹

배고파요 2021. 11. 14. 14:59
728x90


13.1 멀티태스킹

멀티태스크 응용프로그램을 작성하기 위해서는 스레드(Thread) 가 필요.
스레드 (thread) --> 직역 : 바느질 할 때 사용하는 '실'
즉, 바늘에 꿰어진 하나의 실로,, 하나의 바느질 작업만 할 수 있다는 거지.
--> 하나의 스레드로 하나의 작업밖에 처리할 수 없음.


멀티태스킹을 실현하기 위해서는 2가지 방법 있음.
1. 멀티 프로세싱 (multi-processing) --> 하나의 응용프로그램을 여러 개의 프로세스로 구성하여, 각 프로세스가 하나의 작업을 처리하도록 하는 기법. 독립적으로 실행됨. --> 하나의 응용프로그램에 속하는 프로세스들은 변수를 공유할 수가 없음. --> 오버헤드가 큼.

2. 멀티 스레딩(multi-threading) --> 하나의 응용프로그램을 동시처리가 가능한 여러작업(코드)로 분할하고 , 작업의 개수만큼 스레드를 생성 --> 각 스레드가 하나의 작업을 처리하도록 함.
--> 모든 스레드는 응용프로그램 내의 자원과 메모리를 공유함 --> 통신에 따른 오버헤드 작음. + 스레드 사이의 문맥 교환 시 소요되는 작업량이 작아서 문맥 교환이 빠른 장점 있음. ==> 응용프로그램이 다수의 스레드를 가지고 다수의 작업을 동시에 처리함으로써, 한 스레드가 대기하는 동안 다른 스레드를 실행하여, 시간 지연을 줄이고 자원의 비효율적 사용을 개선함.



13.2 자바의 멀티스레딩

자바에는 프로세스 X, 스레드 개념만 있음.
JVM은 멀티스레딩만 지원.
자바 스레드는 JVM에 의해 스케쥴 되는 실행 단위 코드블록.
JVM은 하나의 자바 응용프로그램만 실행함. --> 하나의 자바 응용프로그램 안에 여러개의 스레드를 둬서 사용함.
스레드 스케쥴링은 전적으로 JVM에 의해 이뤄짐. (모든 스레드 관리는 JVM이 함.)


13.3 스레드 만들기

자바 스레드 만들기 위해서는
1. 스레드 코드 작성
2. JVM에게 스레드를 생성하고 스레드 코드를 실행하도록 요청.

스레드 코드 작성하는 방법
1. Thread 클래스 이용
2. Runnable 인터페이스 이용.


** 스레드에는 interrupt이 가능함. --> interrupt이 생길 수 있는 경우를 조심해야함. --> 그래서 try-catch를 사용해줘야한다는 점 **

** 본래 자바 스레드는 비선점 스케쥴링. --> 중간에 뺏을 수 없다는거.
--> 스레드 실행 도중에 다른 스레드에 양보하도록 yield() 메소드를 호출해야하는 것이 원칙임.
** 근데 JVM이 멀티스레딩을 지원하는 운영체제상에서 실행되는 경우, JVM 은 운영체제의 스레드를 자바 스레드에 매핑시켜서 선점 스케쥴링이 가능하게 함. --> 이 경우, 자바 스레드는 운영체제의 시분할 체계에 의해 자동으로 다른 스레드에게 실행을 양보당함. --> yield()메소드를 호출할 필요 없음.



13.6 스레드 동기화

멀티스레드 --> 다수의 작업을 동시에 실행시키는 응용프로그램 작성 기법. 잘 사용하면 좋은 성능을 낼 수 있음.
** 다수의 스레드가 공유 자원, 공유 데이터에 동시 접근하는 경우에 대한 처리를 해야함.

-->스레드 동기화
: 공유 데이터에 접근하고자 하는 다수의 스레드가 서로 순서대로 충돌 없이 공유 데이터를 베타적으로 접근하기 위해 상호 협력 하는 것.
공유 데이터에 대한 접근은 베타적이고, 독점적으로 이뤄져야함. + 독점적으로 공유 데이터를 다루는 프로그램 코드를 입계 영역(critical section) 이라함.

자바의 스레드 동기화 방법 : 1. synchronized 2. wait()-notify()
1. synchronized 로 동기화 블록 지정.
: 스레드가 공유 데이터를 접근을 시작한 순간, 데이터를 잠궈서. 다른 스레드가 대기하게 함. --> 하나씩 순차적으로 실행하도록 제어하는 기법.
synchronized 블록은, 진입할 때 Lock, 빠져나올 때 UnLock 동작이 자동으로 이루어지게 컴파일됨.
--> synchronized 블록에 진입하는 스레드가 락을 걸어서, 다른 스레드의 접근이 안되게 막고, --> 그러면 다른 스레드들은 synchronized 블록 앞에서, 그 블록 안에 있는 스레드가 나와서 내가 락을 소유하게 될 때 까지 (내가 그 블록에 들어갈 때 까지! ) 대기해서 순차적으로 실행되기를 기다림.


2. wait()-notify() 메소드로 스레드 실행 순서 제어.
:

728x90