2017-12-14 20 views
0

어떻게 notify & notifyAll이 다른지 이해하려고합니다.여러 대기 스레드 중 하나를 통지 한 후 어느 스레드가 실행을 시작할 것입니까

스레드 t1이 리소스 R을 사용하고있는 경우를 생각해 봅시다. 이제 두 개의 스레드 t2 & t3이 동일한 리소스에서 대기 중입니다. t1Rnotify 메서드를 호출하면 t2 & t3 중 하나가 시작됩니까? t1RnotifyAll 메서드를 호출하는 경우 t2 & t3 모두가 알림을 받겠지 만 동일한 리소스에 대해 계속 경쟁 중이므로 둘 중 하나만 시작할 수 있어야합니다. 그리고 어느 쪽이 그렇게 할 수 있을까요?

+0

(https://docs.oracle.com/javase/8/docs/api/java/lang :

우선 순위가 조금 스레드 선택에 말할 것을 테스트하려면 /Object.html#notify--) * "이 객체의 모니터에서 대기중인 단일 스레드를 깨우고 스레드가이 객체를 기다리고 있으면 해당 객체 중 하나가 깨우기 위해 선택됩니다. ** 선택 사항은 임의 ** 스레드는 wait 메소드 중 하나를 호출하여 객체 모니터에서 대기합니다. * " – MadProgrammer

+0

여기에서 답변을 찾을 수 있습니다 - https://stackoverflow.com/questions/37026/java-notify- vs-notifyall-over-again – vinS

답변

0

정확하게 작동하기 시작할 것 같지 않습니다. Java Docs은 그것이 임의적 인 선택이라고 말합니다.

0

Object.notify()는 임의의 대기 스레드를 선택하고 잠금이 이 릴리스되었음을 알리고 자체에 대한 잠금을 가져올 수 있습니다. Object.notifyAll()은 해당 객체의 잠금 을 기다리는 모든 스레드에 알리고 잠금을 얻기 위해 경쟁합니다.

처음에는 각 스레드에 우선 순위를 변경하면 시퀀스를 제어 할 수 있다고 생각할 수도 있습니다. 그러나 그렇지 않은 경우 우선 순위에 따라 우선 순위가 높은 스레드가 실행되도록 이 보장되는 것은 아닙니다.

그러나 실제로 스레드 실행 순서를 제어하려면 스레드 동기화 도구를 사용하십시오. 에서 [자바 문서]에서

public class NotifyVSNotifyAll { 


    public static void main(String[] args) { 

     Object resource = new Object(); 

     Thread a=new Thread(()->{ 
            synchronized (resource) { 
             System.out.println("A"); 
             try{ 
              Thread.sleep(2000); 
              resource.notify(); 
             //resource.notifyAll(); 
             }catch(Exception E){} 
            } 

           }); 
     Thread b=new Thread(()->{ 
      synchronized (resource) { 
       System.out.println("B"); 
       } 

      }); 
     Thread c=new Thread(()->{ 
      synchronized (resource) { 
       System.out.println("C"); 
       } 

      }); 

     a.setPriority(10); 
     b.setPriority(1); 
     c.setPriority(10); 

     a.start(); 
     c.start(); 
     b.start(); 

    } 


} 

Hope its clear.