天天看點

java學習之:多線程程式設計(2)線程的優先級;線程的阻塞和等待;線程守護;線程的中斷線程的優先級線程的阻塞和等待線程守護線程的生命周期線程的中斷

文章目錄

  • 線程的優先級
  • 線程的阻塞和等待
  • 線程守護
  • 線程的生命周期
  • 線程的中斷

線程的優先級

  • Java 采用的是搶占式的 cpu 排程方式(有些系統采用的是平均式的 cpu 排程系統)
  • 是以需要對線程設定優先級來搶占 cpu 的時間片
    java學習之:多線程程式設計(2)線程的優先級;線程的阻塞和等待;線程守護;線程的中斷線程的優先級線程的阻塞和等待線程守護線程的生命周期線程的中斷
  • java 線程的優先級隻有三種常量,不能随意更改,隻能在

    1-10

    範圍内。
  • t.setPriority();

    更改線程優先級
  • t.getPriority()

    擷取線程優先級
  • 線程的優先級高,隻能代表他獲得 cpu 時間片的幾率比較大,并不能保證他最先執行

線程的阻塞和等待

  • 阻塞或等待的線程幾乎不消耗資源
  • 當一個線程企圖獲得一個資源對象的鎖;而這個資源正被其他線程占有,目前線程就會阻塞
  • 通過下面方法的調用可以讓線程進入(計時等待狀态):
    • static void sleep(long millis)

      : 使正在進行的線程停留指定的毫秒數
    • void join()

      :等待終止指定的線程。
      • 也就是:讓主線程等待子線程的終止。
        java學習之:多線程程式設計(2)線程的優先級;線程的阻塞和等待;線程守護;線程的中斷線程的優先級線程的阻塞和等待線程守護線程的生命周期線程的中斷
      • 主線程的代碼塊中,如果碰到了

        t.join()

        方法,此時主線程需要等待(阻塞),等待子線程結束了(Waits for this thread to die.),才能繼續執行

        t.join()

        之後的代碼塊。
      • join()

        方法一共有三個重載,都被

        final

        修飾,無法被子類重寫。
      • join() = join(0)

        代表主線程會一直等,直到子線程結束
      • join()

        方法中調用了

        wait()

        方法
      • join()

        sleep()

        一樣,可以被中斷(被中斷時,會抛出

        InterrupptedException

        異常);不同的是,

        join()

        内部調用了

        wait()

        ,會出讓鎖,而

        sleep()

        會一直保持鎖。
    • join(long mills)

      :等待

      mills

      個毫秒,這是

      join()

      方法的重載
    • Thread.State.getState()

      :擷取目前線程的狀态

線程守護

  • 當主線程結束的時候,守護主線程的線程都會結束。
  • Thread.currentThread()

    擷取目前的主線程
    java學習之:多線程程式設計(2)線程的優先級;線程的阻塞和等待;線程守護;線程的中斷線程的優先級線程的阻塞和等待線程守護線程的生命周期線程的中斷
  • void setDaemon(boolean on)

    : 将該線程标記為守護線程,當運作的線程都是守護線程的時候,java 虛拟機退出。

線程的生命周期

java學習之:多線程程式設計(2)線程的優先級;線程的阻塞和等待;線程守護;線程的中斷線程的優先級線程的阻塞和等待線程守護線程的生命周期線程的中斷

線程的中斷

  • 線程如果在等待或者被阻塞,可以通過在 “被阻塞的線程上” 調用

    interrupt()

    方法,這時候,這個阻塞将會被一個

    interruptedException

    異常中斷。
  • 線程被中斷并不代表這個線程應該被終止,因為線程可以有進行中斷的行為
  • 内中斷就是異常(interruptedException)
  • 外中斷通常指裝置終端:比如磁盤中斷,列印機中斷