Java Thread

EUNLEE·2022년 7월 14일
0

2022.07.14 목요일

Exception

  • compile time error
  • runtime error
    • Error: program이 지속될 수 없는 오류 ❌
    • 🌟 Exception: 해결이 가능한 오류 ⭕
      • Exception이라는 클래스가 있다. 그 하위 클래스에 대표적으로 nullpointException이 있다.

프로그램을 실행하다가 프로그램이 정상적인 수행이 안되면(exception이 발생할 수 있는 상황에 처하면)

→ JVM이 현재 오류실행에 대한 정보를 모아 instance를 생성

→ 이 객체를 우리가 프로그램적으로 처리

  • 잘 처리되면 강제 종료되지 않고 지속적인 수행
  • 처리하지 않으면 강제종료

Thread

  • Thread가 무엇인지?
  • 중요한 용어, class와 method
  • Network service를 만들기 위해 활용

Process

“실행중인 프로그램”

프로그램을 실행시키기 위해 OS로부터 resource를 할당받아야 해요.

  1. code: 프로그램 실행 코드
  2. data: 데이터
  3. Heap: 동적 할당 영역
  4. Stack: 함수 콜스택을 쌓기위한 스택 영역

최소 1개 이상의 thread가 존재

  • thread가 딱 1개 있어요. →single-thread process
  • thread가 2개 이상 있어요. → multi-thread process

Process = resource + thread

resource

  • code
  • data
  • stack
  • Heap

thread

  • 여러 개
  • execution stack을 별도로 가지고 있는 실행 흐름

CPU(core → 한 순간에 한가지 일만 수행)

만약 single core를 가정하면 여러 프로그램이 마치 동시에 실행되는 것처럼 보인다.(Excel, powerpoint, game, music, …)

→ time sliding(시분할) ⇒ Multitasking(멀티태스킹)

multiprocessing → core가 2개 이상일 때를 의미

multi-threading

  • 장점: 효율적인 처리, 응답속도가 ⬆️
  • 단점: 프로그램이 어렵다. → 공유 자원에 대한 “동기화 처리” ⇒ 교착문제(deadlock)

Java에 Thread를 만들어 사용하려면 어떻게 해야하나요?

method ≠ thread. method는 thread가 아니다.

thread는 실행 흐름. thread가 method를 호출한다.

Java에서는 thread 자체가 instance임. → Java에서 thread를 만드는 class가 존재한다. ⇒ “Thread class”

💡 Java에서 thread를 생성하는 법
1. 🌟 [직접 상속] Thread class를 상속해서 User define thread class를 만들어서 이용한다.
- 단일 상속에 대한 문제, tightly coupled 문제가 있다.
2. 🌟 [간접 상속] Runnable interface를 구현하고 User define class를 작성한다. → instance를 만들어 new Thread(instance)

Thread의 상태전이도

Process의 종료

내부에서 파생된 모든 User define thread가 종료되는 순간 process가 종료된다.

Thread 우선순위 할당

// thread에 우선순위 할당 -> single core에서만 의미가 있다.
// multi-core 환경에서는 우선순위의 의미가 없다.
	t1.setPriority(10);
	t2.setPriority(2);

Daemon Thread(데몬 스레드)

  • 다른 일반 Thread의 보조적인 작업을 위해 사용
  • Daemon Thread는 이 Thread를 파생시킨 thread가 종료되면 같이 종료된다.

⇒ Garbage collection, 자동저장 기능

데몬 스레드 만들기 → t1.setDaemon(true)

기억해야하는 thread의 method

  1. sleep(long millisecond)

    → 일정시간동안 thread를 중지시킨다.

    sleep에 들어가면 쿨쿨잔다.

    1. 지정된 시간이 다 되거나
    2. thread에 대해 interrupt()가 호출되면 InterruptedException 발생하면서 sleep에서 깨어난다. → 항상 “try ~ catch”

상태전이도(sleep)

interruput()

  • stop() → thread 강제 중지 → x “deprecated”
  • start() → thread 시작!

🧐 Thread 실행 후 작업이 끝나기 전에 해당 Thread를 중지시키고 싶어요!
→ Thread 내부 상태값인 “Interrupted state” 를 변경해요 ~~

Thread가 interrupt가 되었는지 확인하는 방법

  1. interrupted() → Thread의 static ⇒ 현재 수행중인 Thread가 interrupt가 걸렸는지 여부
    • 📍 상태값을 조사하고 그 상태값을 false로 변경
  2. isInterttupted() → static이 아니에요 ⇒ 특정 thread가 interrupt 걸렸는지 여부
    • 현재의 상태값만 true or false로 리턴해준다.

Thread

  • 생성
  • start()
  • sleep()
  • stop() → deprecated
    • stop(): Thread의 (강제)종료
    • suspend(): Thread의 일시중지
    • resume(): 일시중지된 Thread의 재시작
  • interrupt(), interrupted(), isInterruped()
  • yield(): Thread가 자신에게 주어진 실행시간을 다 쓰지않고 다른 Thread에게 양보
    • 프로그램의 응답성을 높이기 위해 사용

💡 volatile keyword
ThreadExam06.java 참고

0개의 댓글