当前位置: 首页 > 知识库问答 >
问题:

为什么我的ReaderWriter解决方案不工作?java,并发

微生阳平
2023-03-14

所以最近我一直在努力思考并发问题。目前,我正在努力寻找读者作家问题的解决方案。

我有一个类文件,它计算读者/作家的数量,并有两个信号量。

当读卡器尝试读取时,只要有写入线程在写入,它就必须等待。当它进入readCount时,readerSemaphore中的readCount会增加

当一个编写器试图进入时,只要有多个读卡器,它就必须等待。当它进入时,获取writerSemaphore并增加writerscount。当它离开时,它释放信号量。

由于某些原因,我无法理解编写器没有在类文件中编辑字符串文件。

提前感谢:)

public class Main { 
public static void main(String[]args) {

    File file = new File("1. Chapter: ");

    Writer w1 = new Writer(file, " w1 ");
    Writer w2 = new Writer(file, " w2 ");

    Reader r1 = new Reader(file);
    Reader r2 = new Reader(file);
    Reader r3 = new Reader(file);
    Reader r4 = new Reader(file);
    Reader r5 = new Reader(file);

    w1.start();
    w2.start();

    r1.start();
    r2.start();
    r3.start();
    r4.start();
    r5.start();     

    try {
        w2.join();
    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    System.out.println("-> Final output: " + file.file);
}}


public class File { 
public String file;

private int readCount;
private int writeCount;

private Semaphore semReader;
private Semaphore semWriter;

public File(String file) {
    this.file = file;

    readCount = 0;
    writeCount = 0;

    semReader = new Semaphore(1);
    semWriter = new Semaphore(1);
}

public synchronized void startReading() {

    try {

        while(writeCount == 1) {
            Thread.currentThread().wait();
        }

        semReader.acquire();
        readCount++;
        semReader.release();

        System.out.println(" --- File was read");

    } catch (InterruptedException e) {
        e.printStackTrace();
    }
}

public synchronized String endReading() {

    String temp = file;

    try {   

        semReader.acquire();    
        readCount--;    
        semReader.release();

    } catch (InterruptedException e) {
        e.printStackTrace();
    }

    return temp;
}

public synchronized void startWriting(String edit) {

    try {

        while(readCount > 0) {
            Thread.currentThread().wait();
        }

        semWriter.acquire();
        writeCount++;   

        System.out.println(" --- File got edited");
        file = file + "hi";
    }
    catch (Exception e) {
    }   
}

public synchronized void endWriting() {

    writeCount--;
    semWriter.release();
}}




public class Writer extends Thread { 
private File file;
private String edit;

public Writer(File file, String edit) {
    this.file = file;
    this.edit = edit;
}

@Override
public void run() {

    Random rand = new Random();

    try {

        sleep(1000);
        System.out.println(">W: " + Thread.currentThread().getName() + " started first write.");
        file.startWriting(" first" + edit);

        sleep(3000);
        System.out.println(">W: " + Thread.currentThread().getName() + " ended first write.");
        file.endWriting();

        sleep(2000);
        System.out.println(">W: " + Thread.currentThread().getName() + " started second write.");
        file.startWriting(" second" + edit);

        sleep(3000);
        System.out.println(">W: " + Thread.currentThread().getName() + " ended second write.");
        file.endWriting();

        System.out.println(">W: " + Thread.currentThread().getName() + " finished");

    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}}




public class Reader extends Thread { 
private File file;

public Reader(File file) {
    this.file = file;
}

@Override
public void run() {

    Random rand = new Random();

    try {

        sleep(rand.nextInt(2000));
        System.out.println(">R: " + Thread.currentThread().getName() + " startet first read.");
        file.startReading();

        sleep(3000);
        System.out.print(">R: " + Thread.currentThread().getName() + " ended first read: ");
        System.out.println(file.endReading());

        sleep(rand.nextInt(2000));
        System.out.println(">R: " + Thread.currentThread().getName() + " startet second read.");            
        file.startReading();

        sleep(3000);
        System.out.print(">R: " + Thread.currentThread().getName() + " ended second read: ");   
        System.out.println(file.endReading());

        System.out.println(">R: " + Thread.currentThread().getName() + " finished");

    } catch (InterruptedException e) {
        e.printStackTrace();
    }

}}

共有1个答案

齐英耀
2023-03-14

编辑:

线程。currentThread()。wait()出错。java文档中不鼓励等待线程。

谢谢你,谢谢你帮助我。

 类似资料:
  • 我是这里的初学者,这个代码在理论上应该是可行的,为你们这些很棒的家伙们帮我干杯! 13195的质因数是5、7、13、29。 600851475143的最大质因数是什么? 欧拉问题3

  • 下面的代码是我解决这个问题的尝试。我使用了基于1的索引。我无法找出错误。我试着调试代码,但没有帮助。我已经被困了两天了。请帮忙。

  • 对于python我是新手,我正在做leetcode问题94,二叉树顺序遍历。给定二叉树的根,返回对其节点值的inorder遍历。 但我还是不明白它为什么有用。在之后,在递归过程中,res变量不会被重新分配给[]吗?或者res变量在不同的递归中应该是不同的变量吗?

  • 有人能找出为什么我的不能工作。也许我错过了什么。我意识到这可能是愚蠢的没有任何更多的上下文比我所展示的,但请您询问,我将很乐意提供更多。 这是一段很大的代码,所以我不知道如何用它生成SSCE。您正在查看的是子类的构造函数,它包含3个面板。此时,只是一个。方法打开一个filechooser,然后加载选定的图像,该图像被绘制到上。图像显示良好,一切正常,除了我调整窗口大小时,没有滚动条。

  • 我正在尝试让Gradle Artifactory插件来解析工件。 我的build.gradle文件在下面,被替换为正确的主机名 然而,当运行此命令时,它无法解析工件。依赖行是从artiFactory生成的。 我打算使用“旧”发布机制。我的Gradle版本是2.0。 我尝试了一个带有maven2默认值和gradle布局的artifactory存储库。 堆栈跟踪可在以下位置找到:http://text