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(); 

} 

}

+1

究竟是什么问题? – XtremeBaumer

+0

请澄清您的具体问题或添加其他详细信息以突出显示您的需要。正如目前所写,很难确切地说出你在问什么。 – GhostCat

+0

Re:“我想我错过了一些基本的东西......”你为什么这么想?你的程序做了什么,你不期望它做什么?另外,如果您要突出显示示例中的哪些部分是由您编写的,以及哪些部分是在作业中提供给您的,这将会很有帮助。 –

首先,我建议你去的javadoc和读取方法定义的等待,通知和notifyAll。这是Java中的基本等待/锁定/通知系统。

就读者和作者而言,读者应该都是从作者那里读取的,如果没有可用的内容,则在作者身上使用wait进行暂停。如果你有多个作者,你可以对等待消息队列的读者做同样的事情。当作者编写并有更多数据供读者使用时,它应该自己调用notify(作者)来唤醒一位消费者以获取新数据。

而且给你时,你可以/应该notifyAll的使用一个想法:

的Thread.join工作,通过对线程调用wait接合带。在线程死亡后,Thread调用notifyAll来唤醒正在等待它完成的所有线程。

+0

他的实际问题是它看起来像是'ReadWriteLock'实现,而不是'PipeChannel'。但是,您的答案更适合于Pipe。 –

+0

@ControlAltDel谢谢。 –