2009-12-15 2 views
-1

놀이터에서 원형 교차로를 사용하기 위해 기다리는 어린이 대기열이 두 개 있습니다. 하나는 북쪽에서, 다른 하나는 남쪽에서 직면합니다. 아이들은 어느 쪽 큐 앞에서 만 로터리를 입력 할 수 있으며 사용 가능한 공간이있는 경우에만 입력 할 수 있습니다 (한 번에 하나의 자식 만 각 세그먼트를 사용할 수 있습니다). 원형 교차로에서 일단 무작위로 사용하면 동쪽이나 서쪽으로 무작위로 나옵니다. 그런 다음 무작위로 다른 곳에서 연주 한 다음 북쪽/남쪽 칸을 무작위로 다시 입력하고 무한정 재생합니다. 원형 교차로는 시계 방향으로 회전하고 큐잉 자식은 항상 따라 오는 첫 번째 공간을 사용합니다. 자바 세마포어를 사용하여 프로그램을 작성하여 공유 원형 경기 객체에 대한 액세스를 자식을 나타내는 일련의 프로세스별로 동기화합니다.Java Semaphore north south que

여기까지 내가 지금까지 한 일이 있으며 다음에 무엇을해야할지 모르겠다. Main 클래스에서는 무엇을해야합니까?

import java.util.Random; 

public class Child extends Thread { 
    private Random random; 
    private int  which; 
    private int  number; 

    public Child(int number) { 
     this.number = number; 
     random = new Random(); 
     this.which = random.nextInt(2); 
    } 

    public void run() { 
    //start point? 
    } 

    public int getNumber() { 
     return number; 
    } 

    private void checkQuePosition() { 
     if (atFront()) 
      tryToGetOn(); 
     else 
      checkQuePosition(); 
    } 

    //returns true if at front of que, else false 
    private boolean atFront() { 
     int position; 
     if (which == 0) 
      position = Playground.north.que.search(this); 
     else 
      position = Playground.south.que.search(this); 
     return position == 1; 
    } 

    private void tryToGetOn() { 
     Playground.roundabout.semaphore.acquire(); 
     //get into the roundabout somehow 
    } 

    //releases semaphore, sleeps for a random period then calls joinQue(random 0 or 1) 
    public void getOff() { 
     Playground.roundabout.semaphore.release(); 
     Thread.sleep(random.nextLong()); 
     joinQue(random.nextInt(2)); 
    } 

    private void joinQue(int w) { 
     this.which = w; 
     if (w == 0) { 
      //join north que 
     } 
     else 
      ;//join south que 
     checkQuePosition(); 
    } 
} 

나는 여기에있다. 나는 지금 길을 잃었다! 도와주세요

+1

실제로 읽을 수 있도록 코드 블록으로 포맷 할 수 있습니까? 또한, "숙제"꼬리표는 여기 집에서 느낄 것입니다 ... – Romain

+0

왜 질문 텍스트가 삭제 되었습니까? – Mizipzor

+0

질문 텍스트를 복원했습니다. Mult는 그런 질문을 삭제하지 마십시오. 자신의 질문을 삭제할 수 있지만 모든 텍스트를 지우고 오해의 소지가있는 태그를 변경하는 것은 매우 나쁜 형태입니다. – Jherico

답변

0

실제 원형 경기장이 아닌 아이들 만 모델링했습니다. 그게 위임 된 것이 아니라면 나는 각 어린이가 자신의 실을 필요로하는지 의심 스럽다.

더 유용한 접근 방법은 각 대기열에 하나씩, 원형 교차로에 하나씩 세 개의 스레드를 만드는 것입니다. 원형 교차로는 작업자 스레드이고 하위 큐는 생성자 스레드입니다. 로터리 (Roundabout) 스레드는 원형 버퍼를 가지며, 각각 '회전 할 시간'이 원형 교차로에 무작위로 결정됩니다. 스레드는 주기적으로 각 자식의 '재생할 시간'을 확인하고 만료 될 때 북이나 남 큐로 임의로 꺼내어 공간이 열려있는 세마포를 발생시킵니다.

두 개의 대기열 스레드는 각각 세마포어를 기다리고 올라갈 때마다 처음으로 얻은 큐는 자식을 무작위로 선택한 '재생할 시간'이있는 원형 교차로 구조에 넣습니다.

또는 로터리 아웃 스레드를 사용하여 동쪽과 서쪽 놀이터에 무작위로 사람을 뽑아 대기열 스레드에서 비울 수 있습니다. 각 공유 콜렉션 (순환 대기 행렬 및 각 대기열 스레드의 실제 하위 목록)이 동기화 측면에서 올바르게 처리되도록해야합니다. 로터리 스레드와 대기열 스레드의 두 클래스 만 있으면되지만 대기열 스레드의 두 인스턴스 (북쪽과 남쪽 각각 하나)가 있습니다.

+0

그들은 단순히 영원히 돌아갈 응용 프로그램을 원합니다. 당신이 설명했듯이 앱에는 출력이 없으므로 프로그램의 디자인이 핵심입니다. 나는 이런 식으로 등급을 매기는 것이 a) 길을 따라 아이들을 잃지 않고 b) 교착 상태와 같은 비길 수없는 상태에 빠지지 않도록 몇 시간 동안 실행하게 될 것으로 기대합니다. – Jherico

+0

당신은 그것에 총을 맞고 왜 문제를 발견하지 못하면 돌아와 더 구체적인 질문을 해보십시오. – Jherico

+0

로터리 클래스가 문제입니다 ..... – Mult

0

세마포어는 어디에 있습니까? 나머지 코드는 어디에 있습니까? 이것이 네가 가진 전부라면 너를 도울만큼 충분하지 않아, 내가 모든 일을하고있는 것처럼 느껴질거야.

+0

로터리가 전혀 존재하지 않는 것처럼 보입니다. 그렇지 않으면 숙제를하는 것이 좋습니다. 하지만 나는 세마포어와 뮤텍스를 추가하여 그들이 다른 누군가에 의해 ocupied되면 원형 교차로에 가지 않도록 보장합니다. – user233220

+0

시원하게, 오늘 밤 나중에 살펴볼 것입니다.하지만 다른 시간에 보드의 다른 코더에게 물어 보면 꽤 유용합니다. 대부분의 사람들이 질문을 볼 수 있도록하십시오. 곧 다시 연락 할거야. – user233220

+0

모든 ur 도움을위한 Greenman 고맙다 ... 나는 진짜로 ... 그것을 주셔서 감사합니다 당신이 약간 결론에 ... 얻은 후에 연락하십시오 나는 기다릴 것이다 나는 의심의 여지가있다 또는 틀린 ... 그러나 다시 감사합니다 ... – Mult

관련 문제