JAVA

[ JAVA ] Thread

주옹스 2020. 8. 20. 14:39

- 프로세스(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 클래스 이용법 >

Thread클래스를 상속받는 클래스를 작성하여 스레드 구현

       1) Thread 클래스를 상속받아 run() 메소드를 재정의 한다.

       2) Thread 클래스를 상속받은 클래스의 객체를 생성하여 start() 메소드를 호출한다.

 

 

 

 

  [  java.lang.Runnable 인터페이스 ]

  -> 인터페이스는 여러개를 사용할 수 있음!

   

 

    * 스레드에서 실행할 코드를 가지는 run()메소드가 선언되어 있다.

 

    * 자바는 단일 상속만 구현 가능하므로 스레드를 구현할 클래스가 다른 클래스를 상속 받은 경우

      Runnable 인터페이스를 구현한다.

 

 

 

< Runnable 인터페이스 이용법 >

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  => 돌발실행 발생시, 우선순위가 높은 거 먼저 실행하고 다시 원래 상황으로 돌아옴.