wait () и notify () не работают должным образом при чтении и записи файла - PullRequest
0 голосов
/ 01 февраля 2019

Мне сообщили об этой проблеме, в которой, если файл в настоящее время получает чтение, никакая операция записи не может произойти на нем и наоборот, используя 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 в качестве теста, lauching 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();

    }
...