DevBoi

Thread와 상태제어 메소드 본문

Language/[Java]

Thread와 상태제어 메소드

HiSmith 2022. 3. 16. 10:11
반응형

스레드는 상태단계 들을 가지고 있다.

 

  • 실행 대기 상태 : 아직 스케쥴링 되지 않아서, 실행을 기다리고 있는 상태
  • 실행 상태 : 실행 대기 상태에 있는 스레드 중에서 스레드 스케쥴링으로 선택된 스레드가 CPU를 점유하고, run()메소드를 실행하는 상태
  • 종료 상태 : run()메소드가 종료되어 더이상 실행할 코드가 없어져 스레드의 실행을 멈추는 것
  • 일시 정지 상태 : 스레드가 실행할 수 없는 상태로 WAITING,TIMED_WAITING,BLOCKED 세가지 상태가 존재한다.
    경우에 따라서, 스레드는 실행 대기 상태가 아닌, 일시정지 상태로 가기도한다.
    - Waiting : 다른 스레드가 통지할때까지 기다리는 상태
    - Timed_waiting : 주어진 시간 동안 기다리는 상태, sleep,wait,join메서드를 이용해 대기하고있는 상태 최대 대기시간을 명시할수있어, 외부적인 변화+시간에 의해서도 대기상태가 풀릴수 있다.
    - Blocked : 사용하고자 하는 객체의 락이 풀릴때까지 기다리는 상태, 다른 스레드가 락을 해제하기를 기다리는 상태, 한스레드가 동기화 코드 영역에 들어갔을때 나머지 스레드는 Block상태가 된다.
    - Terminated : 실행을 마친 상태

주어진 시간동안 일시정지 (sleep)

실행중인 스레드를 일정 시간 멈추게 하고싶다면, sleep을 사용하면된다.

주어진 시간동안 일시정지되고, 다시 실행대기 상태로 돌아간다.

 

다른 스레드에게 실행 양보(yield)

특정 동작을 하지 않는 스레드를 실행시키는것보다, 다른 우선순위가 높거나, 다른 대기상태인 스레드에게 실행기회를 양보하는것이

프로그램 성능 향상에 좋다.

 

다른 스레드 이후에 실행(join)

스레드는 독립적으로 실행이되지만, 다른 스레드 이후에 실행이 되어야 하는경우가 있다.

예를 들면, 특정 연산 후에 결과값을 보여주는 쓰레드의 경우 해당 join을 이용하여 스레드를 실행시킨다.

 

 

notify(), notifyAll()

-해당 메소드는 wait_set에서 대기중인 다른 쓰레드를 깨우는 역할을 한다.

nofity는, wait_set에 있는 임의의 한개의 쓰레드를 Runnable상태로 변경하고,

notifyall은 wait_set에있는 모든 스레드를 runnable상태로 변경하는 차이가 있다.

 

 

 

Thread 중지 방법

-Thread.sleep() -> 자신의 쓰레드에서만 실행가능하고 항상 일시중지하는 정적 메서드이다. 다른 쓰레드가 다른 스레드를 재울순 없다.

-Thread.stop, Thread.destroy

 

* stop 
쓰레드를 강제 종료 시키기 위해서 만들어졌지만, 리소스를 정리하지 못해, 데드락이 발생될 가능성이 있다. (사전 작업에 대한 cleanUp을 하지 않고 종료된다.)

* destroy 
Java의 모든 객체는 monitor를 가지고있고, 이 건 여러 스레드에서 객체를 접근 할 수 없도록 막는 기능을 수행한다.

하지만 Thread.destroy를 하면, Monitor의 잠금 기능이 풀리면서, 여러 객체에서 접근이 가능해진다고 한다.

무튼 쓰지않는다.

 

-Thread.interrupt()함수

안전하게 종료시키는 함수, 즉시종료는 아니고, interrupt flag가 ture로 설정이 되면서, 일시 정지 상태가 되었을때,

InterruptedException 오류를 발생시키게 되어 쓰레드를 종료 할수 있게 된다.

 

 

Start 와 run의 차이 점

start는 Thread 객체가 신규로 생성이 되고, 해당 스레드의 상태를 체크하여, run메소드를 실행한다.

run은 단순 실행 호출이다.

start는 신규 인스턴스가 생성되고, 멀티쓰레드 방식으로 진행이 되지만,

run은 싱글 쓰레드 방식으로, 단일 쓰레드를 실행시키는 역할을 한다.

 

 

 

Thread의 라이프 사이클

 

 

데몬 쓰레드

일반 쓰레드의 작업을 돕는 보조적인 역할을 수행한다.

일반 쓰레드가 모두 종료되면 자동으로 종료된다.

가비지 컬렉터나, 자동저장, 화면 자동 갱신등에 사용된다.

무한루프로, 실행후 대기 하다가 특정 조건이 되면 다시 실행하고, 대기한다.

start호출하기 전에 실행이 된다.

 

 

Synchronized

data에 따라서 쓰레드 세이프하게, 멀티쓰레드 프로그램 환경에서 데이터를 안전하게 관리하는 방법이다.

변수와 함수에 사용이 가능하고, 여러개의 스레드가 한개의 자원을 접근하려고할때, 데이터를 사용하고 있는 스레드를 제외하고

다른 스레드에 대해서 접근 할 수 없도록 막는 개념이다.

block,과 unblock으로 처리를 한다.

추가로, static Synchronized 를 하게되면, 클래스단위로 동기화 설정을 할수 있다.

인스턴스가 달라도, 동기화를 적용할수 있다는 의미이다.

반응형

'Language > [Java]' 카테고리의 다른 글

[Java] HashMap  (0) 2022.03.22
[Java] 함수형 프로그래밍  (0) 2022.03.16
[Java] final,finally,finalize 차이점  (0) 2022.03.16
[Java] 제네릭이란?  (0) 2022.03.15
[Java] 직렬화와 역 직렬화  (0) 2022.03.15