Java阅读器作家
我对我在编程语言类概念中学习的新概念有点难住。任何信息都会很棒。读者作家问题如下:Java阅读器作家
这个古典问题需要进程读取和写入同步。因此,在定义和创建读写线程之前,您需要一个同步控制器。以下是一个控制器类(剩下两个方法供您实现)。为了保持编程简单,当你编写线程类来读写时(比如说三个读写器),你只需要在读或写时开始象征性地打印一条消息,并且在完成读或写时完成另一条消息的打印(因此没有必要为每个线程读取或写入的内容创建实际的共享内容)。
这是我的。我想我缺少一些基本的线程。请注意,除了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();
}
}
首先,我建议你去的javadoc和读取方法定义的等待,通知和notifyAll。这是Java中的基本等待/锁定/通知系统。
就读者和作者而言,读者应该都是从作者那里读取的,如果没有可用的内容,则在作者身上使用wait
进行暂停。如果你有多个作者,你可以对等待消息队列的读者做同样的事情。当作者编写并有更多数据供读者使用时,它应该自己调用notify
(作者)来唤醒一位消费者以获取新数据。
而且给你时,你可以/应该notifyAll的使用一个想法:
的Thread.join工作,通过对线程调用wait
接合带。在线程死亡后,Thread调用notifyAll
来唤醒正在等待它完成的所有线程。
他的实际问题是它看起来像是'ReadWriteLock'实现,而不是'PipeChannel'。但是,您的答案更适合于Pipe。 –
@ControlAltDel谢谢。 –
究竟是什么问题? – XtremeBaumer
请澄清您的具体问题或添加其他详细信息以突出显示您的需要。正如目前所写,很难确切地说出你在问什么。 – GhostCat
Re:“我想我错过了一些基本的东西......”你为什么这么想?你的程序做了什么,你不期望它做什么?另外,如果您要突出显示示例中的哪些部分是由您编写的,以及哪些部分是在作业中提供给您的,这将会很有帮助。 –