나는 새로운 개념에 난처한 인물이다. 나는 프로그래밍 언어 학급에 대한 나의 개념을 배우고있다. 어떤 정보라도 좋을 것입니다. 리더 라이터 문제는 다음과 같습니다 :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();
}
}
정확히 무엇이 문제입니까? – XtremeBaumer
구체적인 문제를 명확히하거나 추가 정보를 추가하여 필요한 것을 정확하게 강조하십시오. 현재 작성된 내용이므로 귀하가 원하는 내용을 정확하게 말하기는 어렵습니다. – GhostCat
Re, "나는 근본적인 것이 빠져 있다고 생각합니다 ..."왜 그렇게 생각하니? 귀하의 프로그램은 당신이 기대하지 않았던 부분에서 무엇을합니까? 또한, 귀하가 작성한 예제의 일부분과 과제에서 어떤 부분이 귀하에게 주어 졌는지를 강조하면 도움이 될 것입니다. –