Я пишу приложение на Java с многопоточностью, которое я хочу приостановить и возобновить.
Поток читает файл построчно, находя совпадающие строки с шаблоном.Это должно продолжаться на том месте, где я остановил поток.Для чтения файла я использую BufferedReader в сочетании с InputStreamReader и FileInputStream.
fip = new FileInputStream(new File(*file*));
fileBuffer = new BufferedReader(new InputStreamReader(fip));
Я использую этот FileInputStream, потому что мне нужен указатель файла для позиции в файле.
При обработке строк, которые он пишетсоответствующие строки в базе данных MySQL.Чтобы использовать MySQL-соединение между потоками, я использую ConnectionPool, чтобы убедиться, что только один поток использует одно соединение.
Проблема в том, что когда я приостанавливаю потоки и возобновляю их, несколько совпадающих строк просто исчезают.Я также попытался вычесть размер буфера из смещения, но он все еще имеет ту же проблему.
Как найти достойный способ решить эту проблему или что я делаю не так?
Некоторые дополнительные сведения:
Цикл
// Regex engine
RunAutomaton ra = new RunAutomaton(this.conf.getAuto(), true);
lw = new LogWriter();
while((line=fileBuffer.readLine()) != null) {
if(line.length()>0) {
if(ra.run(line)) {
// Write to LogWriter
lw.write(line, this.file.getName());
lw.execute();
}
}
}
// Loop when paused.
while(pause) { }
}
Расчетпоместить в файл
// Get the position in the file
public long getFilePosition() throws IOException {
long position = fip.getChannel().position() - bufferSize + fileBuffer.getNextChar();
return position;
}
положить его в базу данных
// Get the connector
ConnectionPoolManager cpl = ConnectionPoolManager.getManager();
Connector con = null;
while(con == null)
con = cpl.getConnectionFromPool();
// Insert the query
con.executeUpdate(this.sql.toString());
cpl.returnConnectionToPool(con);