簡體   English   中英

Java讀寫器

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM