在多執行緒環境下實現定時讀寫同一檔案是常見需求。本文提供兩種完整可執行的實作方案:基於 Thread.sleep() 的簡易版本,以及採用 java.util.Timer 的精確定時版本,並附帶完整程式碼與關鍵細節說明。
建立兩個執行緒,一個每 3 秒寫入目前時間到 test.txt,另一個讀取並輸出新內容。主程式啟動寫入執行緒後稍作等待,再啟動讀取執行緒,避免競態條件。
public class ThreadReadWrite {
public static void main(String[] args) {
new ThreadWrite().start();
try { Thread.sleep(2000); } catch (InterruptedException e) { e.printStackTrace(); }
new ThreadRead().start();
}
}
class ThreadWrite extends Thread {
File file = new File("test.txt");
public void run() {
try {
while (true) {
FileWriter out = new FileWriter(file, true); // 追加模式
out.write(new Date() + "\n");
out.flush(); out.close();
Thread.sleep(3000);
}
} catch (Exception e) { e.printStackTrace(); }
}
}
class ThreadRead extends Thread {
File file = new File("test.txt");
public void run() {
try {
BufferedReader reader = new BufferedReader(new FileReader(file));
while (true) {
System.out.println(reader.readLine());
Thread.sleep(3000);
}
} catch (Exception e) { e.printStackTrace(); }
}
}
注意:Thread.sleep() 精度有限,且若處理邏輯耗時,實際間隔會超過設定值。
使用 Timer.scheduleAtFixedRate() 可實現固定頻率觸發,適合對時間精度有要求的場景。寫入任務每 3 秒執行,讀取任務延遲 1 秒啟動,同樣每 3 秒讀取一次,錯開執行時間減少衝突。
public class ThreadReadWriteTimer {
static File file = new File("test.txt");
public static void main(String[] args) {
Timer timer = new Timer();
// 寫入任務
timer.scheduleAtFixedRate(new TimerTask() {
public void run() {
try (FileWriter out = new FileWriter(file, true)) {
out.write(new Date() + "\n");
} catch (IOException e) { e.printStackTrace(); }
}
}, 0, 3000);
// 讀取任務
timer.scheduleAtFixedRate(new TimerTask() {
BufferedReader reader = new BufferedReader(new FileReader(file));
public void run() {
try { System.out.println(reader.readLine()); }
catch (IOException e) { e.printStackTrace(); }
}
}, 1000, 3000);
}
}
| 維度 | Thread.sleep | Timer |
|---|---|---|
| 精度 | 低(受執行時間影響) | 高(固定頻率觸發) |
| 複雜度 | 低 | 中 |
| 資源管理 | 手動關閉流 | 建議使用 try-with-resources |
| 適用場景 | 簡單測試、非關鍵定時 | 生產環境、需精確間隔 |
實務上若要求嚴格定時,Timer 或 ScheduledExecutorService 是更佳選擇。完整程式碼已包含異常處理與資源釋放,可直接用於學習或專案原型。