[英]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();
}
}
首先,我建議您訪問 javadocs 並閱讀 wait、notify 和 notifyall 的方法定義。 這是 Java 中基本的等待/鎖定/通知系統。
Readers 和 Writers 方面,讀者應該都在從 writer 讀取,如果沒有可用的內容,則使用wait
on writer 暫停。 如果你有多個作者,你可以對等待消息隊列的讀者做同樣的事情。 當寫入器寫入並且有更多數據要被讀取器使用時,它應該調用自身(寫入器)的notify
以喚醒一個消費者以獲取新數據。
並讓您了解何時可以/應該使用 notifyAll:
Thread.join 通過調用wait
加入的線程來工作。 當線程死亡時,Thread 調用notifyAll
來喚醒所有等待它完成的線程。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.