JAVA

태태개발일지 - 고급 자바 멀티 스레드

태태코 2025. 2. 11. 17:53
반응형

 

 

인터럽트

 

1. volatile boolean runFlag

Runnable 클래스 안에 

volatile boolean runFlag = true;

를 선언해준다. 

 

main method에서 task.runFlage = false; 넣으면 작업을 중단할 수 있다.

 

하지만 위와 같은 방법으로는 바로 작업을 중단할 수 없기 때문에 

 

log("작업 중단 지시 thread.interrupt()");

 

2.thread.interrupt(); 

 

인터럽트 메서드를 사용한다.

 

 

하지만 interrupt(); 가 발생했다고 바로 interruptException이 일어나는게 아니다.

sleep(); 과 같이 스레드를 대기시키는 명령어를 만나면 interruptException을 만든다.

 

 

예외가 터지면 -> 이제 인터럽트 상태가 끝나는 것이다.

 

3. Thread.currentThread().isInterrupted()

 

while(Thread.currentThread().isInterrupted()){

}

 

 

하지만 아래 자원정리 로직이있을경우 상태가 변경이 되지않아서 이셉션이나온다.

 

 

이유:

Thread.currentThread().isInterrupted() 메서드는 인터럽트 상태를 변경하지 않기때문이다.

 

 

4. Thread.interrupted();

=> 인터럽트 상태가 true면 false로 변경해준다. 

 

 

여러스레드가 동시에 접근하는 변수에는 volatile를 붙여줘야한다.

여러스레드가 동시에 접근하는 경우 ConcurrentLinkedQueue를 사용해야한다.

 

 

yield

 

yield 상태는 runnable로 유지하고 다시 스케줄링 큐에 들어가는 것이다.

 

 

sleep 은 상태가 바뀌지만 조심해야 할 점은 양보할 사람이 없는데 혼자 양보한 이상한 상황이될수도있다.
더 양보할 스레드가 없는데 양보를 해버리는 상황

 

yield = 메서드는 현재 실행중인 스레드가 자발적으로 CPU를 양보하여 다른 스레드가 실행될 수 있도록한다.

 

runnable 상태를 유지한다 => sleep과 다른점

Running상태에서 ready상태로 변경된다 => java는 이 두상태를 구분할 수 없다.

 

 

 

반응형