Java-JavaSE-多線程

  • 概述
    • 進程
      • 正在運行的程序,是系統進行資源分配和調用的獨立單位。
      • 每個進程都有它本身的內存空間和系統資源。
    • 線程
      • 是進程中的單個順序控制流,是一條執行路徑
      • 一個進程若是隻有一條執行路徑,則稱爲單線程程序。
      • 一個進程若是有多條執行路徑,則稱爲多線程程序。
    • 並行
      • 邏輯上同時發生,指在某一個時間內同時運行多個程序。
    • 併發
      • 物理上同時發生,指在某一個時間點同時運行多個程序。
    • Thread類的方法
      • Thread.currentThread().getName();
      • public final String getName();
    • 線程的狀態
      • 被建立
        • 2種方法(見下)
      • 運行
        • start()
        • 具有CPU的執行資格和執行權,其實就是它正在被CPU處理
      • 臨時阻塞
        • 具有執行資格,不具有執行權,等待被執行
      • 凍結
        • sleep(time)-Thread類的靜態方法
          • sleep()方法會拋出異常,你必須catch,不能拋出,由於父類的run()方法沒有拋異常
          • 不釋放鎖
          • 必須指定time
        • wait()-Object類的方法
          • 喪失執行權和執行資格,釋放鎖
          • 能夠不指定時間
      • 結束
        • stop()
  • 多線程的2種方式
    • 第一種方法:繼承Thread類,而後複寫run()方法,run()方法裏就是線程須要執行的內容,而後建立對象調用start()方法來啓動線程(JVM會調用run()方法)
      • 若是隻是單獨調用run()方法的話,只意味着子類的對象在調用一個普通的函數而已,與線程的開闢無關
    • 第二種方法(由於Java不支持多繼承):實現Runnable接口,覆蓋run()方法,建立Thread對象,且傳入該類的對象,使用Thread對象調用start()方法
  • 線程安全
    • 產生的緣由
      • 多個線程操做同一個共享數據
      • 操做共享數據的代碼有多條
      • 當一條線程操做共享數據的過程當中,其餘線程參與了共享數據的運算,此時就出現了線程安全問題
    • 解決辦法
      • 將操做共享數據的代碼包裝成同步代碼塊
        • synchronized(obj){}
  • 同步
    • 同步的前提
      • 多個線程使用同一個鎖!
    • 同步的方式
      • 1.同步代碼塊synchronized(obj){}
      • 2.同步函數:給函數加synchronized修飾符
        • 同步函數的鎖:this;固然,同步代碼塊也能夠使用this,synchronized(this)
        • 靜態synchronized同步函數使用的鎖是這個函數所屬的字節碼的文件對象。這個鎖能夠使用this.getclass()獲取,也能夠使用類名.class來獲取
  • 死鎖
    • 產生緣由
      • 有2個鎖,某個線程任務持有鎖a,須要鎖b才能繼續執行代碼,而另外一個線程任務此時持有鎖b,在等待鎖a執行其剩餘代碼。
  • 線程間通訊
    • 多個線程處理同一個資源,可是任務不一樣,好比一存一取
  • 等待喚醒機制
    • 用於存一取一,多存多取(要用到while循環判斷,notifyAll()方法喚醒線程池中全部的線程),區別於只多條取
    • 方法,這些方法必須定義在同步中,由於須要明確究竟是操做的哪一個鎖上的線程:
      • 要調用這些方法,須要用監視器去調用。而監視器能夠是任意的對象,因此這些方法都定義在Object中(注意,監視器和鎖的區分)
      • wait();(讓線程進入線程池,不會被賦予執行資格,會釋放執行權,釋放鎖!),
      • notify();(喚醒線程池中的任意線程),
      • notifyAll();(喚醒線程池中的全部線程)
      • (以上3個方法的調用者,必須和同步使用的鎖是一致的!)
  • 1.5新特性
    • Lock lock =new ReentrantLock();
      • 定義一個鎖,用來標識須要進行同步的線程執行內容
      • 開始結束標示:lock.lock();lock.unlock();(一般定義在finally代碼塊中)
    • Condition c =lock.newCondition();
      • 定義一個監視器,能夠定義多個
      • c具備Object監視器的對線程操做的方法:await();signal();signalAll();
  • 線程相關的方法
    • 中斷線程的方法
      • stop()方法--已過期
      • run()方法結束
        • 通常都有循環結構,控制循環條件的話,就能夠控制線程結束的條件
      • interrupt()方法的使用
        • 用於中斷線程的wait()、sleep()狀態,同時拋出一個interruptedException
        • interrupt()方法不會中斷一個正在運行的線程。這一方法實際上完成的是,在線程受到阻塞時拋出一箇中斷信號,這樣線程就得以退出阻塞的狀態。更確切的說,若是線程被Object.wait, Thread.join和Thread.sleep三種方法之一阻塞,那麼,它將接收到一箇中斷異常(InterruptedException),從而提前地終結被阻塞狀態
        • 注意要處理InterruptedException
    • setDaemon
      • public final void setDeamon(boolean on)
      • 將一個線程設置爲後臺線程或者用戶線程,當所剩線程所有都是daemon線程後,JVM退出
      • on爲true的時候設置線程爲Daemon
      • 須要在線程啓動前就設置
    • join()方法
      • 線程t start()之後,t.join()了,那麼當前線程會等你t結束後,當前線程纔會得到CPU執行資格
      • 拋出InterruptedException
    • 線程的priority
      • 1-10,數字越大,優先級越高
      • setPriority(Thread.MAX_PRIORITY);
        • 設置優先級
相關文章
相關標籤/搜索