>source

주 스레드를 유지하고 싶습니다. 3 가지 옵션을 찾았으며 어느 것이 가장 좋은지 궁금합니다. 차이점은 무엇이며 왜 그렇습니까?

그들 사이에 낭비 자원이 있습니까?

  1. 동일 (참) {}

  2. thread.join ()

  3. CountDownLatch (1) .await ()

내가 시도했지만 잘 작동했습니다.

while(true){}
thread.join()
CountDownLatch(1).await()


  • 답변 # 1

    여기 :

    while(true){}
    
    
    "핫"대기합니다. 즉, CPU가 100 % 회전하고 아무 것도하지 않습니다. 어쩌면 운이 좋으면 JVM이이를 감지하여 CPU주기를 태울 수 없습니다.

    join ()은 다음과 같습니다.

    와이즈 비즈

    (이 튜토리얼에서)

    따라서 join ()은보다 건전한 접근법처럼 들립니다. 와이즈 비즈  비슷한 방식으로 작동합니다.

    이 두 가지 방법의 단점은 스레드 인터럽트에 반응하기 때문에 "진정한"루프에 넣는 것이 좋습니다.

  • 답변 # 2

    When we invoke the join() method on a thread, the calling thread goes into a waiting state. It remains in a waiting state until the referenced thread terminates.

    무한 루프는 이유없이 반복적으로 리소스를 낭비하고 계산 시간과 에너지를 소비합니다.

    다른 두 개는 리소스가 차단되어있는 동안 OS가 다른 스레드를 실행할 수 있도록 리소스를 낭비해서는 안됩니다.

  • 답변 # 3

    그들 중 어느 것도 적절하지 않습니다

    await()
    
    

    끝나지 않는 바쁜 루프는 프로세서에서 영원히 회전하여 열을 발생시키고 전기를 소비합니다. 깨끗하게 멈출 수는 없습니다.

    is there any wasting resource among them?

    다른 실이 끝나기를 기다리는 중입니다. 이것은 영원히 달리는 대신 실제로 끝날 수 있기 때문에 다른 것과 다릅니다. 그러나 애플리케이션이 완료 될 때까지 실행중인 다른 스레드로만 구성된 경우 다른 스레드를 작성하고 완료되기를 기다리는 대신 기본 스레드에서 코드를 실행하지 않는 이유는 무엇입니까?

    while(true){}
    
    

    모니터를 만들고 영원히 기다립니다. 이것은 다음과 거의 같습니다 :

    thread.join()
    
    

    다시 말해서 프로그램을 중지 할 수있는 확실한 방법은 없습니다.

    마지막은 CountdownLatch와 함께 사용할 수있는 접근 방식에 가장 가깝습니다. 래치에 대한 참조를 즉시 버리지 않고 실행을 제어하는 ​​코드로 전달하여 주 스레드에 중지 시간을 알릴 수 있도록합니다. 그러나 종료 조건에 대한 신호로 CountdownLatch 자체가 혼동됩니다. 이탈 신호는 부울이므로 세마포어가 더 적합합니다

    CountDownLatch(1).await()
    
    

    이것은 여전히 ​​수신자가 상태를 습득하고 (스케쥴링을 엉망으로함으로써) 타인이 해제 할 수있는 인터페이스 뒤에 세마포어를 숨겨야합니다.

    Object o = new Object(); synchronized (o) { o.wait(); }

  • 이전 compression - 정적 데이터 만 압축하는 알고리즘?
  • 다음 java - Spring Boot Rest의 요청 매개 변수로서 열거 형