source

WAIT와 BLOCKED 스레드 상태의 차이

goodcode 2022. 9. 4. 15:00
반응형

WAIT와 BLOCKED 스레드 상태의 차이

스레드 상태 WAIT와 스레드 상태 BLOCKED의 차이점은 무엇입니까?

스레드상태 문서:


모니터 잠금을 기다리는 동안 차단된 스레드가 이 상태입니다.

★★★★★★★★★★★
가 특정 는 이 입니다.

그 차이를 설명해주지 않아요

는 "Drady"를 상태가 .wait()를 클릭합니다.이것은 대기 상태라고 불립니다.스레드가 대기 상태가 되면 다른 스레드가 호출될 때까지 기다려야 합니다.notify() ★★★★★★★★★★★★★★★★★」notifyAll()를 클릭합니다.

이 스레드가 통지되면 실행할 수 없습니다.이 될 수 할 경우notifyAll()또는 첫 번째 스레드가 작업을 완료하지 않았기 때문에 기회가 올 때까지 차단됩니다.이를 Blocked State라고 합니다.차단됨 상태는 스레드가 Lock on 개체를 획득하려고 할 때 다른 스레드가 이미 잠금을 유지하고 있을 때마다 발생합니다.

다른 스레드가 남아서 이 스레드 찬스가 발생하면 JVM 스레드 메커니즘에 따라 픽업 작업을 수행할 수 있게 된 후 실행 상태로 이동합니다.

차이는 비교적 단순합니다.

서서 BLOCKED스테이트, 스레드가 에 들어갑니다.synchronized 그 안에 또 다른 .synchronized같은 오브젝트에 대해 블록합니다.그런 다음 첫 번째 스레드는 두 번째 스레드가 블록을 빠져나갈 때까지 기다려야 합니다.

서서 WAITING상태, 스레드가 다른 스레드로부터의 신호를 기다리고 있습니다.으로, 「」, 「」라고 하는 호출에 발생합니다.Object.wait() , 「」Thread.join()가 호출될 는 이 Object.notify()는는죽죽죽죽죽

차단 스테이트와 대기 스테이트의 중요한 차이는 스케줄러에 대한 영향입니다.차단 상태의 스레드는 잠금을 위해 경합하고 있습니다.이 스레드는 스케줄러가 서비스해야 하는 것으로 간주되며 실행 중인 스레드에 대해 스케줄러의 결정에 반영될 수 있습니다(이를 통해 스레드가 잠금을 차단할 기회를 얻을 수 있습니다).

스레드가 대기 상태가 되면 시스템에 가해지는 스트레스가 최소화되므로 스케줄러는 걱정할 필요가 없습니다.알림을 받을 때까지 휴지 상태가 됩니다.OS 스레드를 계속 사용하고 있다는 사실만 빼면 전혀 쓸모가 없습니다.

이것이 notify를 사용하는 이유입니다.모든 것이 이상적이지 않습니다.이것에 의해, 이전에는 행복한 휴면 상태에 있던 스레드들이, 시스템에 부하가 걸리지 않게 되어, 대부분의 스레드는, 잠금을 취득할 수 있을 때까지 차단되어 대기 상태가 올바르지 않은 것을 발견해, 대기 상태로 돌아옵니다.진행 가능성이 있는 스레드만 통지하는 것이 좋습니다.

(본질적인 잠금 대신 ReentrantLock을 사용하면 하나의 잠금에 여러 조건을 설정할 수 있으므로 통지된 스레드가 특정 조건에서 대기하고 있는지 확인할 수 있습니다.이것에 의해, 스레드가 동작할 수 없는 것에 대해서 통지를 받았을 경우에 통지 손실의 버그를 회피할 수 있습니다).

스레드 덤프를 해석하기 위한 간단한 관점:

  • 잠깐, 일이 좀 주어지기를 기다리고 있어서 지금은 한가해요.
  • 차단됨 - 작업을 완료하기 위해 바쁜데 다른 스레드가 방해가 되어 지금은 유휴 상태입니다.
  • 실행 가능...(네이티브 메서드) - JVM에 관한 한 아직 완료되지 않은 네이티브 코드를 실행하도록 호출했습니다.고객은 RUNNABLE이며 더 이상의 정보를 제공할 수 없습니다.일반적인 예로는 C로 코딩된 네이티브소켓 리스너 방식이 있습니다.이 방식은 실제로 트래픽이 도착하기를 기다리고 있기 때문에 현재 아이돌 상태입니다.이 경우 실제로는 전혀 실행 중이 아니라(CPU 쓰기 없음) OS 스레드 덤프를 사용하여 확인할 필요가 있기 때문에 이는 특수한 WAIT로 간주할 수 있습니다.

차단됨 - 스레드가 스레드 수명 주기의 실행 가능한 상태에 있으며 개체 잠금을 얻으려고 합니다.대기 - 스레드가 스레드 수명 주기 대기 상태이며 스레드의 실행 가능한 상태로 알림 신호가 오기를 대기합니다.

다음의 예를 참조해 주세요.

스레드 상태의 데모

/*NEW- thread object created, but not started.
RUNNABLE- thread is executing.
BLOCKED- waiting for monitor after calling wait() method.
WAITING- when wait() if called & waiting for notify() to be called.
  Also when join() is called.
TIMED_WAITING- when below methods are called:
 Thread.sleep
 Object.wait with timeout
 Thread.join with timeout
TERMINATED- thread returned from run() method.*/
public class ThreadBlockingState{

public static void main(String[] args) throws InterruptedException {
    Object obj= new Object();
    Object obj2 = new Object();
    Thread3 t3 = new Thread3(obj,obj2);
    Thread.sleep(1000);
    System.out.println("nm:"+t3.getName()+",state:"+t3.getState().toString()+
            ",when Wait() is called & waiting for notify() to be called.");
    Thread4 t4 = new Thread4(obj,obj2);
    Thread.sleep(3000);
    System.out.println("nm:"+t3.getName()+",state:"+t3.getState().toString()+",After calling Wait() & waiting for monitor of obj2.");
    System.out.println("nm:"+t4.getName()+",state:"+t4.getState().toString()+",when sleep() is called.");
}

}
class Thread3 extends Thread{
Object obj,obj2;
int cnt;
Thread3(Object obj,Object obj2){
    this.obj = obj;
    this.obj2 = obj2;
    this.start();
}

@Override
public void run() {
    super.run();
    synchronized (obj) {
        try {
            System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",Before Wait().");
            obj.wait();             
            System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",After Wait().");
            synchronized (obj2) {
                cnt++;
            }
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
}
class Thread4 extends Thread{
Object obj,obj2;
Thread4(Object obj,Object obj2){
    this.obj = obj;
    this.obj2 = obj2;
    this.start();
}

@Override
public void run() {
    super.run();
    synchronized (obj) {
        System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",Before notify().");
        obj.notify();
        System.out.println("nm:"+this.getName()+",state:"+this.getState().toString()+",After notify().");
    }
    synchronized (obj2) {
        try {
            Thread.sleep(15000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}
}

언급URL : https://stackoverflow.com/questions/15680422/difference-between-wait-and-blocked-thread-states

반응형