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는 이 두상태를 구분할 수 없다.

반응형