一時停止して再開したいマルチスレッドを使用してJavaでアプリケーションを作成しています。
スレッドは、パターンに一致する行を見つけながら、ファイルを1行ずつ読み取っています。スレッドを一時停止した場所で続行する必要があります。ファイルを読み取るには、BufferedReaderをInputStreamReaderおよびFileInputStreamと組み合わせて使用します。
fip = new FileInputStream(new File(*file*));
fileBuffer = new BufferedReader(new InputStreamReader(fip));
このFileInputStreamを使用するのは、ファイル内の位置にファイルポインターが必要だからです。
行を処理するときに、一致する行をMySQLデータベースに書き込みます。スレッド間でMySQL接続を使用するには、ConnectionPoolを使用して、1つのスレッドだけが1つの接続を使用していることを確認します。
問題は、スレッドを一時停止して再開すると、一致するいくつかの行が消えてしまうことです。また、オフセットからバッファサイズを減算しようとしましたが、それでも同じ問題が発生します。
この問題を解決するための適切な方法は何ですか、または私は何を間違っていますか?
詳細:
ループ
// 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);