Java一致读取文件

时间:2019-03-31 09:26:04

标签: java multithreading file wait synchronized

我正在练习多线程,我想做以下事情:
一个线程读取文件并将每一行保存在列表中,另一线程读取此列表并打印每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]:

它逐渐增加,但是我要实现的是只打印一行文本文件一次。

0 个答案:

没有答案