programing

java.lang에 대해서Thread.State: WAITING(주차)

goodsources 2022. 11. 10. 20:54
반응형

java.lang에 대해서Thread.State: WAITING(주차)

우선, 정말 멍청한 질문인데, 나는 단지 '주차'가 무엇을 의미하는지 궁금했을 뿐이다.스레드가 주차 대기 중입니까, 아니면 주차 중이어서 대기 상태입니까?그리고 파킹이 발생하면 CPU/메모리 리소스가 얼마나 사용됩니까?실타래를 주차하는 목적은 무엇입니까?

둘째, 자바 스레드 API에서 파크 방식을 살펴봄으로써

허가를 사용할 수 없는 한 스레드 스케줄링을 위해 현재 스레드를 디세블로 합니다.

허가가 사용 가능한 경우 소비되고 콜이 즉시 반환됩니다.그렇지 않은 경우 스레드 스케줄링 목적으로 현재 스레드가 비활성화되어 3가지 중 하나가 발생할 때까지 휴지 상태가 됩니다.

영어는 나의 주된 언어가 아니기 때문에, 나는 「허락」이 「실제 주차 허가」의 일종이라고 이해하는데 어려움이 있습니다.따라서, 다음의 질문들은 다음과 같습니다.

  • 그 의미는 무엇이고, '무엇'은 무엇이며, 누가 어떻게 허가를 확인하고 있는가?
  • 무슨 뜻입니까? '허가가 있으면 소비된다'고 하면 주차가 되는 건가요?
  • 그 다음, 만약 두 번째 포인트가 사실이라면, '주차'와 '휴면 상태'의 차이는 무엇일까요? 만약 허가만 있다면, 나는 그것을 영원히 주차할 수 있고, 그렇지 않다면, 나는 그것을 '잠복'으로 만들 수 있습니다.

감사해요.

허가란 실행을 계속할 수 있는 권한을 의미합니다.주차란 허가를 받을 때까지 집행을 중지하는 것을 의미합니다.

님의 허가와 달리LockSupport는 스레드와 관련지어져 있어(즉, 특정 스레드에 permit이 부여되어 있음), 누적되지 않습니다(즉, 스레드당 permit은 1개뿐이며, 스레드가 permit을 소비하면 사라집니다).

하려면 , 「허락」을 합니다.unpark(). 를 호출하여 할 수 park()수 있는 하고 permit을 park()★★★★★★ 。

Java Thread State Documentation에 따르면 스레드는 다음 세 가지 이유로 WAITING 상태가 될 수 있습니다.

  1. Object.wait 시간 초과 없음
  2. Thread.join 타임아웃 없음
  3. Lock Support.park

스레드에서 파크 메서드를 호출하면 허가가 사용 가능하지 않은 경우 스레드 스케줄링을 위해 스레드가 비활성화됩니다.지정된 스레드가 아직 사용 가능하지 않은 경우 파크 해제 메서드를 호출하여 사용 가능하게 할 수 있습니다.

따라서 LockSupport.park에서 스레드가 WAITING 모드로 되어 있으면 WAITING(주차중)으로 표시됩니다.

현재 스레드에서만 파크를 호출할 수 있습니다.이것은 생산자-소비자 디자인 패턴을 구현하기 위한 매우 유용한 메커니즘입니다.

문서를 읽는 동안 회피할 수 없었던 이 질문을 다시 하게 된 계기는 다음과 같습니다.

허가증을 사용할 수 있는 경우, 그 허가는 소비되고 콜은 즉시 반환됩니다.

그렇다면 허가가 "사용 가능"한 경우, 누가 어떻게 허가가 즉시 소비될 수 있도록 할 것인가?이 사실을 알게 된 것은 다소 사소한 일이었습니다.

public static void main(String[] args) {

    Thread parkingThread = new Thread(() -> {
        System.out.println("Will go to sleep...");
        sleepTwoSeconds();
        System.out.println("Parking...");
        // this call will return immediately since we have called  LockSupport::unpark
        // before this method is getting called, making the permit available
        LockSupport.park();
        System.out.println("After parking...");
    });

    parkingThread.start();

    // hopefully this 1 second is enough for "parkingThread" to start
    // _before_ we call un-park
    sleepOneSecond();
    System.out.println("Un-parking...");
    // making the permit available while the thread is running and has not yet
    // taken this permit, thus "LockSupport.park" will return immediately
    LockSupport.unpark(parkingThread);

}

private static void sleepTwoSeconds() {
    try {
        Thread.sleep(1000 * 2);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

private static void sleepOneSecond() {
    try {
        Thread.sleep(1000);
    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}    

는 그 알 수 .thread실행 중이지만 아직 호출되지 않았습니다.LockSupport.park에서는 " " " 가 호출됩니다LockSupport.unpark따라서 허가증을 사용할 수 있습니다.에는 '어느덧 하다'라고 해요.LockSupport.park허가가 가능하기 때문에 즉시 반환됩니다.

하지 않는 시키고 그 를 호출하면 위험합니다.당신이 제어하지 않는 코드에 스레드가 노출되어 그 코드가 호출되는 경우LockSupport.unpark이 있는 동안에park아 - 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 아, 맞다.

LockSupport javadoc의 상단에 있는 클래스 설명에서 허용을 설명합니다.

이 클래스는 이 클래스를 사용하는 각 스레드와 관련지어집니다(세마포어 클래스의 의미).허가를 사용할 수 있는 경우 파크에 대한 콜은 즉시 반환되며 프로세스 중에 [허가]를 소비합니다.그렇지 않으면 [파크에 대한 콜]가 차단될 수 있습니다.파크 해제를 호출하면, 허가를 사용할 수 있게 됩니다(단, 세마포어와 달리 허가는 누적되지 않습니다).많아야 1개입니다.)

(영어 이외의 사용자가 읽기 쉽도록 [텍스트]를 확대했습니다.)

더 깊은 이해를 가진 누군가가 이것에 대해 자세히 설명해 줄 수 있기를 바란다. axtavt의 답변을 참조하십시오.

마지막으로 javadoc의 마지막 인용문:

이러한 메서드는 상위 수준의 동기화 유틸리티를 작성하기 위한 도구로 사용하도록 설계되었으며, 그 자체는 대부분의 동시성 제어 응용 프로그램에는 유용하지 않습니다.

제가 이해하기로는 "허가"는 스레드를 "파킹 해제"할 수 있는지 여부를 나타내는 개체일 뿐입니다.이는 스레드 자체(또는 스레드를 파킹하려고 할 때 de JRE)에 의해 체크됩니다."소비되었습니다"라는 것은 허가증이 소멸되고 스레드가 해제되지 않는 것으로 알고 있습니다.

멀티스레딩에 대해 좀 더 배워야 할 것 같아요."permit"라고 하는 오브젝트가 있는 디스펜서라고 생각하시면 됩니다.스레드에 주차를 지시하고 스레드가 디스펜서를 체크하면 "허가"가 있는 경우 스레드는 이를 가지고 (주차하지 않고) 남습니다.디스펜서에 "허가"가 없는 경우 스레드는 "허가"가 사용 가능할 때까지 주차됩니다(그리고 디스펜서에 "허가"를 넣을 수 있습니다).unpark.

CPU/메모리 사용량은 OS 등에 따라 다르다고 생각합니다.

언급URL : https://stackoverflow.com/questions/7497793/understanding-java-lang-thread-state-waiting-parking

반응형