[ JAVA ] Thread
- 프로세스(Process) 란?
* 운영체제로 부터 자원을 할당 받은 작업의 단위로, 실행중인 하나의 프로그램을 의미
* 리소스(resource)와 스레드(thread)로 구성
* Code,Data,Heap,Stack영역으로 이루어 지며, 각각의 메모리 공간을 차지
* 동시에 두 개 이상의 프로그램을 특정 기법으로 동시에 실행시키는 기능을 멀티태스킹(multitasking)이라 한다.
-> 특정 기법에는 대표적으로 시분할(Time-Shared)기법이 있다.
- 스레드(Thread) 란?
* 프로세스 내에서 실행되는 흐름의 단위. 즉, 프로세스가 할당 받은 자원을 이용하는 실행단위(흐름)
* 스레드는 프로세스 내에 존재하며, 모든 프로세스는 적어도 하나이상의 스레드를 가지고 있다.
* 프로세스는 자신만의 메모리 공간과 자원을 할당받아 사용하지만, 스레드는 다른 스레드와 메모리와 자원을 공유한다.
-> Code, Data, Heap영역은 다른 스레드와 공유하지만 Stack영역은 공유하지 않는다.
* 둘 이상의 스레드를 가진 프로세스를 멀티 스레드 프로세스(Multi-Thread Process)라고 한다.
- 멀티 스레드(Multi-Thread) 장단점
[장점]
1. 시스템의 자원소모가 줄어든다.
2. CPU의 사용률을 향상시킨다.
3. 프로그램의 응답 시간이 단축된다.
[단점]
1. 자원 공유를 위해 전역변수를 이용하므로 동기화 관련된 문제가 발생할 수 있다.
-> String Buffer, Hashtable, vector 동기화 지원해주나, 느림
2. 잘못 된 변수를 사용하거나 미묘한 시간차로 인해 프로그램에 오류가 발생할 수 있다.
3. 디버깅이 어렵다.
- 스레드 구현 및 실행
[ 자바 메인 스레드 (Main Thread) ]
* 자바는 프로그램(process)가 시작되면 기본적으로 main()메소드를 진입점으로 하는 메인스레드가 생성
되며, 사용자가 정의한 스레드를 생성함으로써 멀티 스레드를 구현할 수 있다.
* main() 메소드는 프로그램의 진입점이지 종료점이 아니므로, 멀티 스레드 환경에서는 모든 스레드가 종
료되어야 프로세스가 종료된다.
[ java.lang.Thread 클래스 ]
-> 다중 상속이 불가능 함으로 다중 상속 필요시 Runnable이용.
* 스레드 생성 및 시작, 관리를 위한 클래스
< Thread 클래스 이용법 >
1) Thread 클래스를 상속받아 run() 메소드를 재정의 한다.
2) Thread 클래스를 상속받은 클래스의 객체를 생성하여 start() 메소드를 호출한다.
[ java.lang.Runnable 인터페이스 ]
-> 인터페이스는 여러개를 사용할 수 있음!
* 스레드에서 실행할 코드를 가지는 run()메소드가 선언되어 있다.
* 자바는 단일 상속만 구현 가능하므로 스레드를 구현할 클래스가 다른 클래스를 상속 받은 경우
Runnable 인터페이스를 구현한다.
< Runnable 인터페이스 이용법 >
1) Runnable 인터페이스를 구현한 클래스를 만든다.
2) run메소드를 재정의 한다.
2-1. Thread 객체를 생성하면서 1) 클래스의 객체를 생성하여 Thread생성자에 인수로 넘긴다.
2-2. 2-1)에서 생성한 Thread 클래스 객체의 start() 메소드 호출
[ 람다식을 이용한 스레드 구현 ]
- 데몬 스레드(Daemon Thread)란 ?
-> 예를들어, 가비지컬렉터, 워드 프로세스의 자동 저장 등 백그라운드에서 특별한 작업을 처리하는 용도로 사용.
* 일반 스레드는 자신의 작업을 수행하도록 되어있는 반면, 데몬 스레드란 일반 스레드로 부터 요청을
받아 특정 서비스를 수행하는 작업을 한다.
* 다른 일반 스레드를 돕는 보조적인 역할을 하는 스레드
* 일반 스레드가 모두 종료되면 데몬 스레드도 자동 종료 된다.
* 데몬 스레드가 생성한 스레드는 자동으로 데몬 스레드가 된다.
- 자바의 스레드 스케줄링
1. 우선순위 방식
* 우선순위가 높은 스레드가 실행 상태를 더 많이 가지도록 스케줄링 하는 것
* 우선순위를 부여하여 코드로 제어가 가능
2. 라운드 로빈 방식
* 시간 할당량(Time Slice)를 정해서 스레드를 정해진 시간만큼 실행시키고 다른 스레드를 실행하는
방식
* JVM에 의해 정해지므로 코드로 제어할 수 없다.
* 스레드는 우선순위를 나타내는 필드를 가지고 있다 ( 1 : 가장 낮음 ~ 10 : 가장 높음 )
* 자바 런 타임 스케줄러는 현재 실행 가능한 스레드들 중에서 우선순위가 가장 높은 스레드를
실행시켜 주는데, 현재 실행중인 스레드 보다 더 높은 우선순위를 갖는 스레드가 실행가능 상태가 되면 자바 런 타임 스케줄러는 우선순위가 더 높은 스레드를 실행시켜 준다.
* 스레드 우선순위는 스레드를 생성한 스레드로 부터 상속받는다.
-> main() 메소드에서 스레드를 생성하면 main() 메소드의 우선순위가 5이므로 자동으로 5를 가진다.
- 스레드 상태 제어
* 모든 입출력은 I/O blocking => 1초를 주면 키보드 입력완료될때까지 일시정지상태에 있음
=> 입출력이 느림.
* wair-notify => 동기화블럭
* suspend-resume => 요새 안씀.
* interrupt => 돌발실행 발생시, 우선순위가 높은 거 먼저 실행하고 다시 원래 상황으로 돌아옴.