2009-12-31 4 views
0

나는 동기화 (수소가 사용 가능하게 될 때까지 기다림)와 함께 생산 수를 시뮬레이트하는 java로 프로그램을 작성했지만 "예기치 않은 연산 Exeption"을 제공하고 작동하지 않는다. 자바의 동기화 된 메소드에서 도움이

내 코드가 있습니다 ... 제발 도와주세요 : 스레드 산소에 대한

// 클래스 공용 클래스 Thread_O는 Runnable를 {

Object object; 

public Thread_O(Object o) { 

    object = o; 
} 

public void run() { 
    try { 

     oxygen(); 

    } catch (InterruptedException ex) { 
     Logger.getLogger(Thread_O.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    throw new UnsupportedOperationException("Not supported yet."); 
} 

public void oxygen() throws InterruptedException { 

    System.out.println("One O2 created..."); 

    synchronized (object) { 

     object.wait(); 
     object.wait(); 
    } 

    System.out.println("**** H2O created..."); 

} 

}

구현 스레드 수소 공용 클래스 Thread_H에 대한

가 // 클래스는 Runnable를 구현 {

Object object; 

public Thread_H(Object o) { 

    object = o; 
} 

public void run() { 
    try { 

     Hydrogen(); 

    } catch (InterruptedException ex) { 
     Logger.getLogger(Thread_H.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    throw new UnsupportedOperationException("Not supported yet."); 
} 

public void Hydrogen() throws InterruptedException { 

    System.out.println("One H2 created..."); 

    synchronized (object) { 

     object.notifyAll(); 
    } 
} 

}

// 기본 클래스에서 우리가 가진 :

개체 개체 = 새 개체();

// 산소의 버튼에서 :

Thread thread_O = new Thread(new Thread_O(object)); 
    thread_O.run(); 

// 수소의 버튼에서 :

Thread thread_H = new Thread(new Thread_H(object)); 
    thread_H.run(); 
+0

중복? http://stackoverflow.com/questions/1978893/java-semaphore-and-monitor – trashgod

+0

와우, 3 개의 복제 스레드, 다른 하나의 복제본이기 때문에 하나가 닫혔습니다. –

답변

2

귀하의 코드 방법 실행의 맨 마지막 줄에 예외를 throw() Thread_O 클래스에 존재합니다.

이 줄을 삭제해야합니다.

3

그런데 스레드는 방법 start()없이 run()으로 시작합니다. run()을 호출하면 메소드를 수행하지만 새 스레드에서는 현재 스레드 번호에서 수행합니다.

+0

Start()와 Run()을 쓰지 만 같은 예외가 발생했습니다 ... – Hero

+0

아시다시피이 팁만 있습니다. 나는 당신의 문제가 캐치 이후에 예외를 던지는 것에 있다고 생각한다. 그래서 당신은 항상 그것을 버린다. 그러나 이것은 다른 사람들에 의해 쓰여졌 기 때문에 나는 그것을 반복하고 싶지 않았다. – Gaim

0

프로그램이 Thread_H 및 Thread_O run() 메소드에서 예외를 throw합니다. run() 메소드에 대한 구현을 제공 했으므로 예외를 throw하는 행을 삭제하십시오. 이 행을 삭제하십시오. @Gaim가 올바른지

throw new UnsupportedOperationException("Not supported yet."); 

당신은 스레드의 실행을 시작하기 위해 시작()를 사용합니다.