我正在用Java多線程編寫一個應用程序,我想要暫停和恢復。
線程正在逐行讀取文件,同時發現模式的匹配行。它必須繼續在我暫停線程的地方。爲了讀取文件,我將BufferedReader與InputStreamReader和FileInputStream結合使用。Java:暫停線程並獲取文件中的位置
fip = new FileInputStream(new File(*file*));
fileBuffer = new BufferedReader(new InputStreamReader(fip));
我使用這個FileInputStream,因爲我需要filepointer作爲文件中的位置。
處理這些行時,它會將匹配行寫入MySQL數據庫。要在線程之間使用MySQL連接,我使用ConnectionPool來確保只有一個線程正在使用一個連接。
問題是當我暫停線程並恢復它們時,幾條匹配線就消失了。我也嘗試從offset中減去buffersize,但它仍然有同樣的問題。
什麼是一個體面的方式來解決這個問題,或者我做錯了什麼?
更多的細節:
循環
// 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);
就像我在之前的文章中所說的。我減去bufferSize,然後添加在緩衝區中讀取的字符。這樣你只減去緩衝區中未讀字符的數量。沒有辦法在標準的BufferedReader中得到這個,但我擴展了標準的BufferedReader來獲得已經被獲得的字符數量。 – Yoni 2011-04-22 09:53:50
@Yoni - 也許問題是字符數與字節數有關。我認爲你不應該深入到文件通道去嘗試找出位置。只需在堆棧中的更高級別計數字符。 – 2011-04-22 10:03:20