2013-12-21 2 views
1

그래서이 과제에서 엘리베이터를 시뮬레이트해야합니다. 지금은 임의의 층에서 스폰되고 임의의 대상 층을 가진 3 명의 사람들을 생성합니다. 나는 그들을 태우고 가져 오는 엘리베이터가 1 ​​대 있습니다. 내가 가진 문제는 엘리베이터가 한 번에 한 사람을 처리한다는 것입니다. 나는 엘리베이터를 타고 도중에 사람들과 마루에 멈추는 방법을 모릅니다. 예 :자바 동시 실행으로 인해 가까운 층에 엘리베이터가 있습니다.

이용시 1의 시작 층이 3이고 가고있다

8 이용시 2의 개시 층 (9)이며, (10)에 가고 이용시 3의 시작 층이 6이고, 9

방법 그것에 가고 현재 작동 중입니다. 엘리베이터가 3으로 이동 한 다음 8로 이동합니다. 3 층의 6 층에서 멈추지 않고이 문제를 해결할 수 있는지 잘 모르겠습니다.

층 사이를 이동하는 엘리베이터의 코드는 다음과 같다 :

public void moveTo(int floor) throws InterruptedException 
{ 
    int distance; 

    synchronized(this) 
    { 
     distance = Math.abs(currentFloor - floor); 
     System.out.println(name + " is on floor " + currentFloor + " moving to " + floor); 
    } 

    Thread.sleep(1000 * distance); 

    synchronized(this) 
    { 
     currentFloor = floor; 
    } 
} 

그리고 엘리베이터의 주요 run() 메소드는 이것이다 :

public void run() 
{ 
    try 
    { 
     for(;;) 
     { 
      ElevatorTask task; 

      synchronized(this) 
      { 
       while(next_task == null) 
        wait(); 

       task = next_task; 
       next_task = null; 
       notify(); 
      } 

      moveTo(task.getDestination()); 
     } 
    } 
    catch(InterruptedException ex){} 
} 

이에 어떤 도움이 좋을 것 . 감사합니다 그냥 생각

+1

목적지는 어떻게 주문됩니까? 6과 9에서 멈출 필요가있는 경우, 현재 3시에 있다는 사실을 기반으로 6시에 중단하기로 결정할 논리는 어디에 있습니까? 즉, "getDestination"은 무엇입니까? –

+3

나는 Elevator가 ElevatorMotionState : STOPPED, MOVING에 의해 설명 된 것을 상상한다. ElevatorDirectionState : HEADING_UP, HEADING_DOWN뿐만 아니라 위치에 대한 이중 값을가집니다. 필자는 바닥에 대한 요청을 받아들이는 ElevatorControl, 올라가거나 내려가는 요청을 받아들이라는 요청을 받아 들여 이러한 요청이 어떤 유형의 대기열 (정렬 된 대기열, 층별로 분류 됨)에 배치 될 것이라고 생각합니다. –

+3

무한 대기 시간을 피하는이 공정한 알고리즘은 사실 다소 복잡한 문제입니다. – Voo

답변

1

는 : 사람이있는 경우

당신의 엘리베이터가 바닥 옆에

확인합니다. '예'인 경우 문을 열고 '아니오'일 경우 다음 층으로 건너 뜁니다.

모든 사람을 바닥에 보낸 후 리프트를 부르는 사람이있는 가장 가까운 층으로 이동하십시오.

+1

답장을 보내 주셔서 감사합니다. 네, 코드에서 어떻게해야 하는지를 알아 내야한다는 것을 이해하고 있습니다. – AndyOHart

+1

여러분을 환영합니다! – ioanD

0

moveTo(task.getDestination());을 잘못된 위치에 넣은 것 같습니다. 작업이 동기화 된 블록과 작업에 있어야합니다. 그렇지 않으면 다중 스레드가 moveTo 메서드를 호출 할 수 있습니다. 도움이 되길 바랍니다.