ABOUT ME

개발자입니다 :)

Today
Yesterday
Total
  • Thread
    Java 2022. 2. 20. 18:51

    2월 19일 토요일 보강으로 스레드 관련 강의를 들었다.

     

    Process

    • Process란 실행중인 program을 말한다.
    • 프로그램을 실행시키려면 OS로부터 resource를 할당받아야 한다.
    • Resource 4가지
      • Code
      • Data(static variable)
      • Heap(동적 할당 메모리 영역)
      • Call Stack(method 호출에 대한 지역변수 관리)

     

    • resource만 가지고 프로그램을 실행시킬 수는 없고, 프로그램을 수행시키는 주체가 필요한데 그게 Thread !

     

     

    Thread

    • Process는 resource와 thread로 구성되어 있는데, 그 중 thread는 single thread program과 multi thread program으로 만들 수 있다.
    • Java에서 Thread는 Instance(객체)기 때문에 Class를 정의해서 사용한다.

     

    Thread 만드는 방법

    1. Thread class를 상속하는 방법

    • run을 Override해서 사용

     

    2. Runnable interface를 구현하는 방법 ( 이 방법을 주로 사용하는데, 상속은 단일상속만 지원하고 상속하면 class간 tightly coupled되기 때문)

    • run을 Override해서 사용

     

     

    Thread의 상태 전이

    1. 객체를 만들어서 start() 시킨다.
    2. Thread가 runnable 상태로 변한다.
    3. JVM이 가지고 있는 Thread Scheduler에 의해 Thread가 running한다. (run method 실행)
    4. run() 메서드가 complete되면 Thread는 dead한다.

    => Java 프로그램은 process 안에 있는 사용중인 모든 thread가 종료되면 프로그램이 종료된다!

     

     

    Multi Core CPU 경우 Thread 실행제어

    purpose) 효율적인 프로그램 작성

    method를 이용해서 Thread의 Scheduling 제어하기

     

    1. sleep(milliseconds)

    • 지정된 시간동안 Thread 수행을 멈춘다.
    • sleep하는 동안 thread에 interrupt()을 실행시킬 수도 있기 때문에 반드시 예외처리 필수!

     

    2. interrupt()

    • 특정 Thread에 interrupt()를 걸어서 exception 발생시키고 Interrupted state를 변경한다.
    • interrupt()가 호출되었는지 확인하는 메서드 (됐으면 true, 그렇지 않으면 false)
      • interrupted() : 현재 수행중인 Thread에 대해서 interrupt가 호출되었는지 확인. false로 초기화
      • isInterrupted() : 특정 Thread에 대해서 interrupt 호출되었는지 확인. false로 초기화

     

    3. yield()

    • Thread 자신에게 주어진 실행시간을 다른 Thread에게 양보하는 method
    • 이 메서드 역시 프로그램의 응답성을 높이기 위해 사용

     

    4. join()

    • Thread가 자신이 하는 작업을 잠시 멈추고 다른 Thread가 지정된 시간동안 작업을 수행할 수 있도록 처리
    • interrupt()에 의해서 대기상태에서 벗어날 수 있으니 예외처리 필수!
    • purpose) ?? next lesson TBC

     

     

    multi-core processor를 사용하면,

    이 core들이 수행속도를 높이기 위해 내부적으로 Cache를 가지고 있다.

    메모리에서 읽어야 할 값이 만약 cache에 존재한다면 cache 값을 이용한다!

    그래서, 우리가 memory에 있는 값을 바꿔도 바뀐 값으로 출력이 안 될 수 있다. 그럴 땐 cache를 무시하고 memory를 읽어서 사용하라는 명령어 volatile을 변수 선언할 때 타입명 앞에 사용한다.

Designed by Tistory.