Файл параллельного чтения Java - PullRequest
0 голосов
/ 31 марта 2019

Я практикую многопоточность и хочу сделать следующее:
Один поток читает файл и сохраняет каждую строку в списке, другой поток читает этот список и печатает каждые 10 новых строк.
Использование wait(), notify(), synchronized() обязательно!

Итак, мой первый класс, который читает файл:

    private void read() {
        try (Stream<String> stream = Files.lines(Paths.get(BIG_FILE))) {
            stream.forEach(resource::addLine);
        } catch (IOException e ){
            System.err.println(e);
        }
    }

    @Override
    public void run() {
        read();
    }

И второй, который печатает это:

    @Override
    public void run() {
        while(true) {
            resource.printLastTenLines();
        }
    }

И, наконец, класс, содержащий мой общий список

private List<String> resource = new ArrayList<>();

public synchronized void addLine(String line) {
    try {
        if(resource.size() % 10 == 0) {
            wait();
        }
        resource.add(line);

    } catch (InterruptedException e) {
        System.err.println(e);
    }
}

public synchronized void printLastTenLines() {
    if(resource.size() > 10) {
        for(int i = resource.size() - 10 ; i < resource.size(); i++ ){
            System.out.println("line[" + i + "]: " + resource.get(i));
        }
    }
    notify();
}

и основная функция:

public static void main(String... args) {
        SharedResource resource = new SharedResource();
        Thread loaderThread = new Thread(new FileLoader(resource));
        Thread printerThread = new Thread(new Printer(resource));
        loaderThread.start();
        printerThread.start();
    }

Проблема в том, что она перекрывает маленький кусочек вывода, который я получаю:

строка [160]:
строка [161]:
строка [162]:
строка [163]:
строка [165]:
строка [156]:
строка [157]:
строка [158]:
строка [159]:
строка [160]:

Это медленно увеличивалось, но я хочу напечатать каждую строку текстового файла только один раз.

...