2013-07-04 3 views
1

안녕하세요 여러분, 내 문제입니다. notifyAll을 호출 했음에도 불구하고 잠금을 해제하지 않았으므로 이유를 설명하고 해결책을 알려주십시오. 새로운 스레드입니다. 미리 감사드립니다.자바에서 객체의 잠금 해제

class Lock1 {} 

class Home1 implements Runnable { 
private static int i = 0; 

private Lock1 object; 
private Thread th; 

public Home1(Lock1 ob, String t) { 

    object = ob; 
    th = new Thread(this); 
    th.start(); 
} 

public void run() { 
    synchronized (object) { 

     while (i != 10) { 
      ++i; 
      System.out.println(i); 
     } 
     try { 
      // System.out.println("here"); 
      object.wait(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 

     } 
     System.out.println("here thread 1"); 
    } 
} 
} 

class Home2 implements Runnable { 
private static int i = 0; 

private Lock1 object; 
Thread th; 

public Home2(Lock1 ob, String t) { 

    object = ob; 
    th = new Thread(this); 
    th.start(); 
} 

public void run() { 
    synchronized (object) { 

     while (i != 10) { 
      ++i; 
      System.out.println(i); 
     } 
     try { 
      // System.out.println("here"); 
      object.wait(); 
     } catch (InterruptedException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 

     } 
     System.out.println("here thread 2"); 

    } 
} 

    } 

public class Locking { 

public static void main(String arg[]) { 
    Lock1 ob = new Lock1(); 

    new Home1(ob, "thread 1"); 
    new Home2(ob, "thread 2"); 
    synchronized (ob) { 
     ob.notifyAll(); 
    } 
} 

} 
+1

안녕하세요 - 코드로 무엇을 달성하려고하는지 더 자세히 설명해 주시겠습니까? – robjohncox

+1

"Home1"과 "Home2"라는 중복 클래스가있는 이유를 모르겠습니다. 그리고 정확히 무엇을 성취하려고합니까? – Multithreader

+0

그냥 스레드로 놀고 여기에 모든 잠금을 해제하고 프로그램의 실행을 완료하려고합니다. 여기서 실행이 완료되지 않습니다. –

답변

6

notifyAll을 사용하는 경우 상태가 변경되어야하고 대기를 사용할 때 상태가 변경되는지 확인해야합니다.

스레드가 실제로 시작될 때까지 notifyAll이 오래 호출 될 가능성이 있습니다. (컴퓨터의 경우, 스레드 시작은 10,000,000 클럭 사이클과 같이 영원을 취합니다.) 이는 notifyAll이 손실되었음을 의미합니다. (실제로 그 순간에 실제로 대기중인 스레드에만 알립니다.)

+0

또 다른 훌륭한 대답입니다. +1, 공리적으로. – Bathsheba

+1

선생님, 어떤 방법으로도 실행을 완료 할 수 있습니까? 알림이 호출되기 전에'sleep()'을 주 스레드에 넣을까요? –

+0

네, 효과가있었습니다! 절대적으로 정확한 설명. –