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

Java 多線程編程實戰:Timer、Swing Timer、Thread 與 Runnable 全方位對比

     編輯:J2EE

四大線程工具選型指南

工具適用場景關鍵特點
java.util.Timer簡單重複任務、後台非 GUI單線程調度、毫秒精度、任務定義在 TimerTask.run()
javax.swing.TimerGUI 定時更新、Swing 組件操作事件分發線程(EDT)執行、ActionListener 介面、線程安全
Thread 繼承長時間運行、需自定義線程行為覆寫 run()、start() 啟動、單繼承限制
Runnable 實現解耦任務邏輯、靈活配合線程池實現 run()、傳給 Thread 建構子、無繼承限制

java.util.Timer 範例:每 500ms 打印 "Hi"

TimerTask task = new TimerTask() {
    public void run() { System.out.println("Hi"); }
};
Timer timer = new Timer();
timer.schedule(task, 0, 500); // 立即開始,間隔 500ms
System.in.read(new byte[10]); // 等待 Enter
timer.cancel();

Swing Timer 範例:GUI 計數器

JFrame frame = new JFrame();
JLabel label = new JLabel("0", JLabel.CENTER);
label.setFont(new Font("Serif", Font.PLAIN, 36));
frame.add(label);

ActionListener listener = new ActionListener() {
    int count = 0;
    public void actionPerformed(ActionEvent e) {
        label.setText(String.valueOf(++count)); // 安全更新 GUI
    }
};
new Timer(500, listener).start();
frame.setSize(300, 100);
frame.setVisible(true);

核心差異:Swing Timer 在 EDT 執行,可直接操作組件;util.Timer 在工作線程,操作 GUI 需 SwingUtilities.invokeLater()。

Thread vs Runnable 選擇原則

  • 需繼承其他類 → 實現 Runnable
  • 純線程邏輯、無繼承需求 → 繼承 Thread 亦可
  • 現代最佳實踐:Runnable + 線程池 (ExecutorService)

進階範例:並行下載 URL 計數 + 定時打印

Thread downloader = new Thread(() -> {
    try (BufferedReader r = new BufferedReader(
            new InputStreamReader(new URL(url).openStream()))) {
        int cnt = 0; while (r.read() != -1) cnt++;
        System.out.println("Size: " + cnt);
    } catch (Exception e) { e.printStackTrace(); }
});

Thread printer = new Thread(() -> {
    while (true) {
        System.out.println(msg);
        Thread.sleep(500);
    }
});
downloader.start(); printer.start();
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved