定時器 Timer
Timer類主要負責計劃任務的功能
一些方法:
schedule(TimerTask task, Date time)
在指定的日期執行某一次任務。schedule(TimerTask task, long delay)
以執行此方法的當前時間為參考時間,在此時間基礎上延遲指定的毫秒數後執行一次TimerTask任務schedule(TimerTask task, long delay, long period)
以執行此方法的當前時間為參考時間,在此時間基礎上延遲指定的毫秒數,再以某一間隔時間無限次數地執行某一TimerTask任務scheduleAtFixedRate(TimerTask task, Date firstTime, long period)
在指定的日期之後,按指定的間隔週期,無限迴圈的執行某一任務
schedule
和scheduleAtFixedRate
的異同:
同:
- 多次呼叫
schedule
或scheduleAtFixedRate
執行多個任務的話,則都是以佇列的方式一個一個的被順序執行。所以不用考慮非執行緒安全的問題。 - 如果任務延時了,那麼下一次任務的執行時間都是上一次任務結束的時間(都帶
period
引數時)
異:
- 不延時時,
schedule
下一次任務的執行時間是上一次任務開始加上period
的時間,scheduleAtFixedRate
下一次任務的執行時間是上一次任務結束的時間。
單例模式與多執行緒
單例模式是23個設計模式中的一種,本章將它與多執行緒結合考慮
- 立即載入/“餓漢模式”:呼叫方法前,例項已經被建立了。
- 延遲載入/“懶漢模式”:呼叫get()方法時例項才被建立。最常見的實現辦法是在get()方法中進行new例項化。可是在多執行緒環境中會出問題,即建立多個例項。
解決方案
- 宣告synchronized關鍵字,但執行效率非常低
- 同步程式碼塊,但效率也非常低
- 針對某些重要程式碼單獨的同步,效率提升,但是會建立多個例項
- 使用DCL雙檢查鎖
public class MyObject {
private static MyObject myObject = new MyObject();
private MyObject() {}
public static MyObject getInstance() {
try {
if (myObject != null) {
} else {
Thread.sleep(3000);
synchronized (MyObject.class) {
if (myObject == null) myObject = new MyObject();
}
}
}
catch (InterruptedException e) {
e.printStackTrace();
}
return myObject;
}
}
複製程式碼
- 使用靜態內建類
- 使用static程式碼塊
- 使用enum列舉資料型別
拾遺增補
執行緒狀態:
執行緒組:- 執行緒組中可以有執行緒物件,也可以有執行緒組,組中還可以有執行緒。作用是可批量管理執行緒或執行緒組物件,有效地對執行緒或執行緒組物件進行組織。
- 例項化一個執行緒組時如果不指定所屬的執行緒組,它會自動歸屬到當前執行緒物件所屬的執行緒組中。
執行緒中出現異常的處理:
setUncaughtExceptionHandler()
給指定執行緒對線設定異常處理器setDefaultUncaughtExceptionHandler()
對指定執行緒類的所有執行緒物件設定異常處理器