Я практикую многопоточность и хочу сделать следующее:
Один поток читает файл и сохраняет каждую строку в списке, другой поток читает этот список и печатает каждые 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]:
Это медленно увеличивалось, но я хочу напечатать каждую строку текстового файла только один раз.