2017-04-11 3 views
-1

나는 새로운 개념에 난처한 인물이다. 나는 프로그래밍 언어 학급에 대한 나의 개념을 배우고있다. 어떤 정보라도 좋을 것입니다. 리더 라이터 문제는 다음과 같습니다 :Java reader writer

이 고전적인 문제는 읽기 및 쓰기를위한 프로세스 동기화가 필요합니다. 따라서 읽기 및 쓰기 스레드를 정의하고 작성하기 전에 동기화 컨트롤러가 필요합니다. 다음은 컨트롤러 클래스입니다 (구현할 수있는 두 가지 메서드가 있습니다). 프로그래밍을 단순하게 유지하려면 읽기 및 쓰기 (예 : 세 명의 독자와 한 명의 작성자)를위한 스레드 클래스를 작성할 때 읽기 또는 쓰기를 시작할 때 메시지를 기호화하여 인쇄하거나 읽기 또는 쓰기를 완료 할 때 다른 메시지 만 인쇄하면됩니다. 스레드가 읽거나 쓰는 실제 공유 컨텐츠를 작성할 필요가 없습니다.

다음은 내가 가지고있는 것입니다. 나는 스레드에 근본적인 무언가를 놓치고 있다고 생각합니다. startWriting() 및 stopWriting()을 구현해야한다는 것을 제외하고는 컨트롤러 클래스와 메서드가 제공되고 필요합니다. 고맙습니다.

class Controller { 
private int activeReaders = 0; 
private boolean writerPresent = false; 

protected boolean writeCondition() { 
    return activeReaders == 0 && !writerPresent; 
} 

protected boolean readCondition() { 
    return !writerPresent; 
} 

protected synchronized void startRead() { 
    while (!readCondition()) 
     try { wait(); } catch (InterruptedException ex) {} 
    ++activeReaders; 
} 

protected synchronized void stopRead() { 
    --activeReaders; 
    notifyAll(); 
} 

protected synchronized void startWriting(){ 
    writerPresent = true; 
    System.out.println("Writing has begun"); 
} 

protected synchronized void stopWriting(){ 
    System.out.println("Reading is now available"); 
    writerPresent = false;  
} 

public static void main(String [] args){ 
    Controller c = new Controller(); 

    Thread tRead1 = new Thread(new Runnable() { 
     @Override 
     public void run(){ 
      c.startRead(); 
      System.out.println("Reader 1 has started reading"); 
      c.stopRead(); 
      System.out.println("Reader 1 has stopped reading"); 
     } 
    }); 
    Thread tRead2 = new Thread(new Runnable() { 
     @Override 
     public void run(){ 
      c.startRead(); 
      System.out.println("Reader 2 has started reading"); 
      c.stopRead(); 
      System.out.println("Reader 2 has stopped reading"); 
     } 
    }); 
    Thread tRead3 = new Thread(new Runnable() { 
     @Override 
     public void run(){ 
      c.startRead(); 
      System.out.println("Reader 3 has started reading"); 
      c.stopRead(); 
      System.out.println("Reader 3 has stopped reading"); 
     } 
    }); 
    Thread tWrite1 = new Thread(new Runnable() { 
     @Override 
     public void run(){ 
      c.startWriting(); 
      c.stopWriting(); 

     } 
    }); 

    tRead1.start(); 
    tRead2.start(); 
    tWrite1.start(); 
    try { 
     tWrite1.join(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
    tRead3.start(); 

} 

}

+1

정확히 무엇이 문제입니까? – XtremeBaumer

+0

구체적인 문제를 명확히하거나 추가 정보를 추가하여 필요한 것을 정확하게 강조하십시오. 현재 작성된 내용이므로 귀하가 원하는 내용을 정확하게 말하기는 어렵습니다. – GhostCat

+0

Re, "나는 근본적인 것이 빠져 있다고 생각합니다 ..."왜 그렇게 생각하니? 귀하의 프로그램은 당신이 기대하지 않았던 부분에서 무엇을합니까? 또한, 귀하가 작성한 예제의 일부분과 과제에서 어떤 부분이 귀하에게 주어 졌는지를 강조하면 도움이 될 것입니다. –

답변

0

첫째, 난 당신의 notifyAll JavaDoc을 가서 대기하기위한 방법 정의를 읽어 통지하고, 좋습니다. 이것은 Java에서 기본 대기/잠금/통보 시스템입니다.

독자와 작가의 측면에서 볼 때 독자는 모두 작가의 책을 읽고 있어야하며 내용이없는 경우 작가의 wait을 사용하여 정학 처분해야합니다. 여러 작성자가있는 경우 메시지 대기열에서 기다리는 독자와 동일한 작업을 수행 할 수 있습니다. 작가가 글을 쓰고 더 많은 데이터가 리더에 의해 소비 될 때, 그것은 새로운 데이터를 얻기 위해 하나의 소비자를 깨우기 위해 작가 (작가)에게 notify을 호출해야합니다.

그리고 당신이 /가는 notifyAll 사용해야 수있을 때의 아이디어를 제공하기 :를 Thread.join이 스레드에 wait를 호출하여 작동

이 함께 결합되는합니다. 스레드가 종료되면 스레드는 notifyAll을 호출하여 스레드가 완료 될 때까지 기다리는 모든 스레드를 시작합니다.

+0

실제 문제는 'PipeChannel'이 아니라 'ReadWriteLock' 구현입니다. 그러나 귀하의 대답은 Pipe에 더 적합합니다. –

+0

@ControlAltDel 감사합니다. –

관련 문제