一、線程創建
1. 繼承 Thread
類(傳統寫法)
class MyThread extends Thread { @Override public void run() { System.out.println("線程執行"); }
}
// 使用示例
MyThread t = new MyThread();
t.start();
缺點:Java 單繼承限制,靈活性差。
2. 實現 Runnable
接口(解耦推薦)
class MyRunnable implements Runnable { @Override public void run() { System.out.println("線程執行"); }
}
// 使用示例
Thread t = new Thread(new MyRunnable());
t.start();
優點:避免單繼承問題,任務與線程解耦。
3. 匿名內部類(簡化寫法)
(1)繼承 Thread
的匿名內部類
Thread t = new Thread() { @Override public void run() { System.out.println("通過繼承Thread的匿名內部類創建的線程"); }
};
t.start();
特點:
- 直接繼承
Thread
,重寫run()
。 - 缺點:無法再繼承其他類,靈活性低。
(2)實現 Runnable
的匿名內部類
Thread t = new Thread(new Runnable() { @Override public void run() { System.out.println("通過實現Runnable的匿名內部類創建的線程"); }
});
t.start();
優點:
- 任務與線程解耦,保留繼承能力。
(3)兩種匿名內部類的對比
維度 | 繼承 Thread 的匿名類 | 實現 Runnable 的匿名類 |
---|---|---|
繼承限制 | 占用繼承資格(無法繼承其他類) | 無繼承限制 |
代碼靈活性 | 低(任務與線程綁定) | 高(任務與線程解耦) |
Lambda 支持 | 不支持(需重寫 run() 方法) | 支持(Runnable 是函數式接口) |
推薦場景 | 簡單的一次性任務 | 通用場景,尤其是需要解耦任務與線程時 |
4. Lambda 表達式(Java 8+ 推薦)
Thread t = new Thread(() -> System.out.println("線程執行"));
t.start();
優點:語法糖,簡化 Runnable
匿名類寫法。
二、線程中斷
核心方法:interrupt()
Thread t = new Thread(() -> { while (!Thread.currentThread().isInterrupted()) { System.out.println("運行中"); }
});
t.start();
// 中斷線程
t.interrupt();
關鍵點:
interrupt()
設置中斷標志位,需在代碼中主動檢查。- 若線程在
sleep()
/wait()
中,調用interrupt()
會拋出InterruptedException
,并清空中斷標志。 - 處理中斷的正確姿勢:
try { Thread.sleep(1000);
} catch (InterruptedException e) { // 重置中斷標志或退出線程 Thread.currentThread().interrupt(); break;
}
三、線程等待
核心方法:join()
Thread t = new Thread(() -> { System.out.println("子線程執行");
});
t.start();
t.join(); // 主線程等待 t 執行完畢
System.out.println("主線程繼續");
參數擴展:
join(long millis)
:最多等待指定毫秒。
適用場景:需要確保線程執行順序(如線程B依賴線程A的結果)。
四、線程休眠
核心方法:sleep()
Thread.sleep(1000); // 休眠1秒,釋放CPU
特點:
- 不釋放鎖(與
wait()
不同)。 - 讓權:休眠期間不參與CPU調度。
五、獲取線程實例
核心方法:Thread.currentThread()
Thread t = Thread.currentThread();
System.out.println("當前線程:" + t.getName());
用途:在 Runnable
任務當中獲取當前線程引用。
總結
- 創建線程:優先使用
Runnable
+ Lambda。 - 中斷處理:檢查標志位或捕獲異常,確保資源釋放。
- 線程控制:
join()
協調執行順序,sleep()
主動讓權。 - 最佳實踐:避免繼承
Thread
,保持任務與線程解耦。
結語
多線程編程是提升程序性能的利器,但也像一把雙刃劍——用得好,事半功倍;用不好,bug 叢生。通過本文,我們探討了 Thread
類的核心用法,從線程創建、中斷控制到協作與休眠,每一步都關乎程序的效率與穩定。
記住:優先選擇 Runnable
** + Lambda**,讓任務與線程解耦;謹慎處理線程安全,避免數據競爭的“暗坑”;善用 join()
和 sleep()
,在并發中尋求秩序。
如果你在實戰中遇到過有趣的線程問題,或有更好的實踐心得,歡迎在評論區分享——技術之路,唯有交流才能走得更遠。🎯
愿你的代碼在多線程的世界里,既快如閃電,又穩如磐石!