2017-04-11 124 views
-1

我對我在編程語言類概念中學習的新概念有點難住。任何信息都會很棒。讀者作家問題如下: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:「我想我錯過了一些基本的東西......」你爲什麼這麼想?你的程序做了什麼,你不期望它做什麼?另外,如果您要突出顯示示例中的哪些部分是由您編寫的,以及哪些部分是在作業中提供給您的,這將會很有幫助。 –

回答

0

首先,我建議你去的javadoc和讀取方法定義的等待,通知和notifyAll。這是Java中的基本等待/鎖定/通知系統。

就讀者和作者而言,讀者應該都是從作者那裏讀取的,如果沒有可用的內容,則在作者身上使用wait進行暫停。如果你有多個作者,你可以對等待消息隊列的讀者做同樣的事情。當作者編寫並有更多數據供讀者使用時,它應該自己調用notify(作者)來喚醒一位消費者以獲取新數據。

而且給你時,你可以/應該notifyAll的使用一個想法:

的Thread.join工作,通過對線程調用wait接合帶。在線程死亡後,Thread調用notifyAll來喚醒正在等待它完成的所有線程。

+0

他的實際問題是它看起來像是'ReadWriteLock'實現,而不是'PipeChannel'。但是,您的答案更適合於Pipe。 –

+0

@ControlAltDel謝謝。 –