wait()和notify()在文件读写中无法按预期工作

时间:2019-02-01 17:08:55

标签: java multithreading wait

我遇到了以下问题:如果当前正在读取文件,则可以使用wait()和notify()在文件上进行写操作,反之亦然。我试图提出一个解决方案,但是在第一次读取程序后,仅执行写操作并被卡住。这是代码

public static boolean LOCK = false;

public synchronized void read() {
    String path = "/path/to/file/working.txt";

    while (LOCK == true) {
        try {
            System.out.println("reading paused..");
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    try (BufferedReader bin = new BufferedReader(new FileReader(path))) {
        LOCK = true;
        String line = "";
        System.out.println("reading now..");
        while ((line = bin.readLine()) != null) {
            System.out.println(line);
        }

        LOCK = false;
        notify();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

public synchronized void write(String word) {

    String path = "/path/to/file/working.txt";

    while (LOCK == true) {
        try {
            System.out.println("writing paused..");
            wait();
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }

    try (PrintWriter out = new PrintWriter(new BufferedWriter(new FileWriter(path, true)))) {
        System.out.println("writing resumed..");
        LOCK = true;
        out.println(word);
        LOCK = false;
        notify();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

我通过了一个水果的String数组作为测试,将read()和write()作为单独的线程启动,并且我得到的输出是

Writing resumed..
reading..
Apple
Writing resumed..
Writing resumed..
Writing resumed..

输出被完全写入,但是在第一个字之后没有读取操作发生。请您告诉我我做错了什么吗?谢谢。

这是测试代码,

String[] fruits = { "Apple", "Banana", "Orange", "Cherry", "Date", "ElderBerry", "Marionberry", "Blueberry", };

        FileSyncDemo fileDemo = new FileSyncDemo();

        Runnable r = () -> {

        try {
                fileDemo.read();
                Thread.sleep((long) (Math.random() * 1000));
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        };

        Runnable r2 = () -> {

            try {
                for (int i = 0; i < fruits.length; i++) {
                    fileDemo.write(fruits[i]);
                    Thread.sleep((long) (Math.random() * 1000));
                }
            } catch (InterruptedException e) {
                e.printStackTrace();
            }

        };

        Thread t = new Thread(r);
        t.start();

        Thread t2 = new Thread(r2);
        t2.start();

    }

0 个答案:

没有答案