글쎄, 나는 두 번째 학기에 학생이고 이제 우리는 쓰레기 실로 가고 있습니다. 나는 대부분 그것을 얻지 만, 무언가가 내 운동 중 하나에 관한 것이고 나는 그것을 아주 이해할 수 없다.실습 - 이해 도와주세요
"베이커리 샵에서 상점에 도착한 다음 번호가 (올바른 번호)이 될 때까지 기다려야 할 때가 많습니다." 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 루프의 조건에있었습니다. 이제 의도 한대로 작동하지만 첫 번째 고객은 건너 뜁니다. 첫 번째 고객 만 건너 뛴 다음 모든 방법을 따라야합니다.
이 프로그램의 예상 된 동작은 무엇입니까? 그리고 발생한 동작은 무엇입니까? 코드로 판단하면 교착 상태가 발생할 수 있습니다. – Soronbe
질문이 아직 명확하지 않습니다. 위의 코드를 이해하고 싶습니까? 또는 운동에이 코드를 사용하고 싶습니다. –
어쨌든 문제는 아니지만 takeNextNumber()는 notify() 또는 notifyAll()을 절대로 호출하지 않습니까? 혹시 왜 그런 생각을 해 봤니?wait()를 호출하면 기본적으로 다른 스레드가 특정 기간 동안 멈추도록 신호를 보내고 ** ** notify는 notify() 또는 notifyAll()을받을 자격이 없으므로? – ShayHaned