2011-06-11 5 views
0

고전적인 소비자 \ 생산자 스레드 senario에서 i는 대기열에 벡터를 사용해야합니다. 다른 스레드가 "고객"벡터 및 통지 사용보다 추가하면서자바 스레드에서 벡터를 올바르게 동기화

public synchronized QueueLine getCustomer(int index) 
    { 
     while (Customers.isEmpty()) 
     { 
      try 
      { 
       wait(); 
      } 
      catch (InterruptedException e) {} 
     } 
     return Customers.elementAt(index); 
    } 

: 나는 벡터의 요소가 될 때까지 다른 기다려야 하나 개의 스레드를 필요로하기 때문에 , 나는 다음과 같은 방법을 시도했다. 일단 notify()가 다른 스레드에 영향을 미치지 않기 때문에 나는 뭔가 worng을하고 있음을 알고 있습니다.

+0

"효과가 없습니까?" getCustomer()에 대한 호출이 반환되지 않는다는 것을 의미합니까? 코드를 더욱 완벽한 테스트 시나리오로 확장 할 수 있습니까? – Dan

답변

1

소비자 인스턴스에서 동기화 중입니다. 생산자에서

public QueueLine getCustomer(int index) { 
    synchronized (Customers) {   
     while (Customers.isEmpty()) { 
      Customers.wait(); 
     } 
     return Customers.elementAt(index); 
    } 
} 

, 당신은 동일한 작업을 수행해야합니다 : 동기화 및 Vector에 통지 난 당신이 Vector에 동기화한다고 생각합니다.

+0

그는 객체를 기다리고있는 쓰레드 외부의 notifyAll()을 호출했기 때문에 쓰레드 자체에 문제가 없어야한다. 그래서 이것이 어떻게 문제가되는지 알지 못한다. (잘 안되는 방식으로 객체를 깨울 것이다. 프로그래머가 예상했지만 표시된 코드에서는 문제가되지 않을 것입니다.) – Voo

+0

@Voo 무슨 뜻인지 이해가 안됩니다. 내 말은 공용 객체 (벡터)에서 동기화가 발생해야한다는 것입니다. 소비자가 스스로 기다리고 생산자가 스스로 통보하면 프로그램이 작동하지 않습니다. – gpeche

+1

음, 나는 그들이 같은 인스턴스에서 기다리고 있다고 가정하고 싶다. 개인용 잠금 객체 대신에 이것을 사용하는 것이 문제가 될 수있다.즉 누군가가 인스턴스에 대한 참조를 가지고 있고 그것에 wait()를 호출합니다 - 통지 만 사용하면 독립적 인 스레드가 발생하여 업데이트가 손실됩니다 - 분명히 문제가 발생할 수 있지만이 경우 문제가되지는 않습니다. (적어도 소비자/생산자 용). 심지어 다른 물건을 기다리는 그를 생각하지 않았다;) – Voo

1

이것은 실제로 작동해야하며 이것을 구현하는 일반적인 방법 중 하나입니다. 즉, 작동하지 않는 코드의 나머지 절반에 버그가있을 수 있습니다. 하지만 실제로이 같은 문제를 해결할 수있는 몇 가지 해결책이있는 완벽하게 훌륭한 자바 동시 패키지가 있기 때문에 숙제를 제외하고는 직접 구현할 이유가 없습니다.

원하는 구현의 1 : 1 구현은 BlockingQueue (해당 구현 중 하나임 - 모델에 가장 적합한 것을 선택하십시오)입니다.

Java 1.2 이후로 사용되지 않는 클래스를 사용해야하는 경우 정확히 무엇이 잘못된 것인지 파악할 수 있도록 더 많은 코드를 게시해야합니다.

+0

BlockingQueue에 대해 알고 있고 숙제가 적절하다고 생각합니다. – gilibi

+0

나머지 절반은 간단합니다 : public synchronized void insert (int arrival) { ID = EntranceLine.size() + 1; QueueLine newCustomer = new QueueLine (ID, ServiceType, 도착); EntranceLine.add (newCustomer); notifyAll(); } – gilibi

+0

죄송합니다. 코드는 정상적으로 작동합니다. notifyAll은 실제로 요소에 벡터를 추가 할 수 있기 때문에 실제로 필요하지 않습니다. 코드에 발생할 수없는 객체를 추가 할 수 없기 때문에 제작자가 멈출 수있는 경우에만 의미가 있습니다. 문제 없습니다. 소비자 벡터는 클래스의 필드이며 코드의 다른 곳에서 객체를 기다리지 않고 있습니까? – Voo

관련 문제