首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

Java 多執行緒定時讀寫同一檔案實戰:Thread.sleep 與 Timer 兩種方案完整比較

     編輯:Java 相關知識

在多執行緒環境下實現定時讀寫同一檔案是常見需求。本文提供兩種完整可執行的實作方案:基於 Thread.sleep() 的簡易版本,以及採用 java.util.Timer 的精確定時版本,並附帶完整程式碼與關鍵細節說明。

方案一:Thread.sleep 簡易實作

建立兩個執行緒,一個每 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 精確定時調度

使用 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.sleepTimer
精度低(受執行時間影響)高(固定頻率觸發)
複雜度低中
資源管理手動關閉流建議使用 try-with-resources
適用場景簡單測試、非關鍵定時生產環境、需精確間隔

實務上若要求嚴格定時,Timer 或 ScheduledExecutorService 是更佳選擇。完整程式碼已包含異常處理與資源釋放,可直接用於學習或專案原型。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved