java多執行緒程式設計chap5-7

Zouxxyy發表於2019-03-14

定時器 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) 在指定的日期之後,按指定的間隔週期,無限迴圈的執行某一任務

schedulescheduleAtFixedRate的異同:

同:

  • 多次呼叫schedulescheduleAtFixedRate執行多個任務的話,則都是以佇列的方式一個一個的被順序執行。所以不用考慮非執行緒安全的問題。
  • 如果任務延時了,那麼下一次任務的執行時間都是上一次任務結束的時間(都帶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()對指定執行緒類的所有執行緒物件設定異常處理器


完結撒花!

相關文章