2017-03-12 1 views
-2

글쎄, 나는 두 번째 학기에 학생이고 이제 우리는 쓰레기 실로 가고 있습니다. 나는 대부분 그것을 얻지 만, 무언가가 내 운동 중 하나에 관한 것이고 나는 그것을 아주 이해할 수 없다.실습 - 이해 도와주세요

"베이커리 샵에서 상점에 도착한 다음 번호가 (올바른 번호)이 될 때까지 기다려야 할 때가 많습니다." Im 문제가있는 것으로 생각되는 모니터의 메소드를 복사하여 붙여 넣으 려합니다.

private NumberDispenser(){ 
    nextNoToTake=1; 
    nextNoToServe=0; 
} 

public static NumberDispenser accessDispenser(){ 
    if(theOne == null){ 
     theOne = new NumberDispenser(); 
    } 
    return theOne; 
} 


@Override 
public synchronized void takeNextNumber() { 
    int currNo = nextNoToTake; 
    nextNoToTake++; 
    notifyAll(); 
    System.out.println("No:"+currNo+" has been taken|nextNoToServe:"+nextNoToServe); 
    while(currNo != nextNoToServe) 
     {try { 
      wait(); 
     } catch (InterruptedException e) {} 
     } 
    System.out.println("No:"+currNo+" has been served"); 
    notify(); 
} 

@Override 
public synchronized int nextCustomer() {//Serves the current customer and goes to the next one 
    System.out.println("Clerk is ready to deal with a new customer"); 

    while((nextNoToServe)>=nextNoToTake-1) 
     try { 
      wait(); 
     } catch (InterruptedException e) {} 
    nextNoToServe++; 
    notifyAll(); 
    System.out.println("Now serving No:"+(nextNoToServe)); 

    return nextNoToServe; 
} 

모니터 클래스입니다. 고객과 서기의 경우 두 가지가 더 있으며, 테스트의 경우 두 가지가 더 있습니다. 고객 클래스는 브라우징을위한 시간을 시뮬레이트하기 위해 Thread.sleep을 가지며, 디스커버리 .takeNextNumber();에 들어간다. 그 다음에는 메인 클래스에서 자체적으로 죽어야한다 .Clerk 루프 dispenser.nextCustomer) 주된 방법은 루프를 위해 별도의 고객과 스레드 및 여러 점원과 스레드를 생성합니다.

///// 요구 사항에서 복사하여 붙여 넣습니다. 고객 도착 및 서기는 스레드별로 시뮬레이션됩니다.

TakeANumber 인터페이스를 구현하는 NumberDispencer 클래스를 모니터로 구현하십시오. 힌트 : 두 개의 인스턴스 변수를 정의 할 수 있습니다 private int nextNumberToTake = 1; private int nextNumberToServe = 1;

두 개의 스레드 클래스를 구현

: 고객이 번호를 복용하고 서기는 그 다음 고객 번호를 받고 다음 서비스를하게되어 봉사 시뮬레이트하는 스레드 클래스  를 제공하고 시뮬레이트하는 스레드 클래스 .

예를 들어 베이커리 숍을 시뮬레이션하기 위해 main 메소드로 클래스를 구현합니다. 서빙 직원 2 명과 고객 10 명. /////

나는 코드를 거의 수정했다. 문제는 while 루프의 조건에있었습니다. 이제 의도 한대로 작동하지만 첫 번째 고객은 건너 뜁니다. 첫 번째 고객 만 건너 뛴 다음 모든 방법을 따라야합니다.

console output

+0

이 프로그램의 예상 된 동작은 무엇입니까? 그리고 발생한 동작은 무엇입니까? 코드로 판단하면 교착 상태가 발생할 수 있습니다. – Soronbe

+0

질문이 아직 명확하지 않습니다. 위의 코드를 이해하고 싶습니까? 또는 운동에이 코드를 사용하고 싶습니다. –

+0

어쨌든 문제는 아니지만 takeNextNumber()는 notify() 또는 notifyAll()을 절대로 호출하지 않습니까? 혹시 왜 그런 생각을 해 봤니?wait()를 호출하면 기본적으로 다른 스레드가 특정 기간 동안 멈추도록 신호를 보내고 ** ** notify는 notify() 또는 notifyAll()을받을 자격이 없으므로? – ShayHaned

답변

0

나는 깨진 곳을 볼 수 있습니다.

힌트 : 고객이 도착하기 전에 하나의 서버와 한 고객이 있으며 서버가 nextCustomer()을 호출한다고 가정합니다. 고객이 도착하면 무엇이 깨어날 것입니까?

또한이 문구는 해킹입니다.

if (nextNoToServe == 0) 
    nextNoToServe = 1; 

인스턴스 변수를 적절한 값으로 초기화해야합니다. 예 : 생성자에서.

+0

예, 조금 더 잘 이해하려고 시도했습니다. 나는 한 명의 점원과 한 명의 고객을 두었습니다. 그들이하는 일은 너무 엉망입니다. 나는 모든 스레드가 작업을 시뮬레이트하기 위해 잠을 자고, 무엇이 잘못 됐는지 기다리고 부품을 알리려고한다. –

+0

점원이 고객과 거래 할 준비가되면 어떤 고객 (자연스럽게) 고객이 왔는지 알 수있다. 와서 즉시 제공 받으십시오. 카운터의 배치가 잘못 되었습니까? 아니면 그것이 예정되어있는대로하고 있습니까? 저는 방금 Sysouts의 배치를 엉망으로 만들었습니다. –

+0

팁을 주셔서 감사 드리며 한 가지 오류를 수정했지만 이제는 첫 번째 고객을 건너 뜁니다. 내가 계속 찾고 있지만, 당신은 매우 도움이되었습니다, 고마워요 :) –