我正在练习多线程,我想做以下事情:
一个线程读取文件并将每一行保存在列表中,另一线程读取此列表并打印每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]:
它逐渐增加,但是我要实现的是只打印一行文本文件一次。