天天看點

java多線程基礎篇---基礎java并發基礎

文章目錄

  • java并發基礎
    • 線程基礎
      • 預備知識
      • Java基礎知識
    • 轉載申明

java并發基礎

随着摩爾定律的失效,程式的運作的速度已經越來越依賴于程式設計的合理性。在一些特定的場合下,多線程能大大提高程式的速度。

線程基礎

預備知識

  • 在起初計算機的線程是與CPU核心數相等的,2002年釋出超線程技術後,計算機的線程就能與核心數成1:2的關系。比如i7 8700k 就是采用4核8線程。
  • 現在的作業系統大多是多線程的, 雖然我們感覺不到線程在運作,但往往同時運作的線程數會超過CPU的實際線程數。這時候就會使用時間片輪轉(RR)排程,既一個CPU實際的線程按時段分為多份,運作大于實際線程的任務。因為切換的時間很短,是以幾乎感覺不出差别。
  • 線程切換會涉及到一些線程資訊的處理,這一過程是消耗時間的,是以當虛拟線程遠大于實際線程的時候,切換時間片所消耗的時間,可能會大于實際線程運作的時間。
  • 原子性操作,就是指操作粒度最小的操作,比如“a+b”這個操作就不是原子操作。它的實際操作步驟是1.取a的值,2.取b的值,3.計算a+b的值。當我們任意一步執行時,都可能會遇到上述所說的時間片切換。比如執行完成操作1時,時間片進行切換,切換的時間片修改了b的值,那麼等再次切換到"a+b"這個時間片時,獲得的就不是預期值了。打個比方如果"a+b"這個操作是原子操作,那麼隻有兩種可能,1.a+b執行且執行完 2.a+b沒執行 。因為這個操作是一個整體。

Java基礎知識

java中的建立線程,是通過協作的方式進行管理的

  1. 建立線程的三種方式
  • 繼承Thread 重寫 run()方法
  • 實作接口 Runnable 實作 run()方法
  • 實作接口 Callable 實作 call()方法,Callable可以有傳回值,Runnable沒有傳回值
  1. stop(),resume(),suspend()

    java多線程的設計初衷是協作式,是以現在已經不建議使用。stop()會導緻線程不會正确釋放資源,suspend()容易導緻死鎖。這些都是強制關閉或暫停的手段。

  2. interrupt(),isInterrupted(),Thread.Interrupted()

    調用interrupt(),會将線程内的辨別位制位true這是需要程式員手動通過isInterrupted()方法或者靜态方法Thread.Interrupted()去判斷辨別位是否為true 進而停止線程執行。

    Thread.Interrupted()會在判斷完成後預設将狀态辨別制為false。

    我們也可以自己寫一個辨別變量,完成線程的停止。值得一提的是,我們自己寫的辨別,無法将線程從等待狀态立馬喚醒,也就是說如果有Thread.Sleep(),那麼我們自己寫的辨別判斷必須等到sleep結束後才能執行。

  3. yield()

    讓正在執行的線程,讓出目前時間片的執行權,重新競争時間片。是以下個時間片任然有可能會執行該線程。

  4. priority

    設定線程優先級,取值範圍是[1,10],預設值為5。但線程的優先級不可靠,由作業系統控制,不建議作為線程開發時候的手段。

  5. daemon

    設定守護線程,守護線程與主線程同時結束,如果如主線程結束時,守護線程正在執行,則停止守護線程。這種停止是不會觸發finally()的

  6. join

    線程A,執行了線程B的join方法,線程A必須要等待B執行完成了以後,線程A才能繼續自己的工作。

轉載申明

  1. 部落格中标注原創的文章,版權歸原作者 kkgggkg 所有;
  2. 未經原作者允許不得轉載本文内容,否則将視為侵權;
  3. 轉載或者引用本文内容請注明來源及原作者;
  4. 對于不遵守此聲明或者其他違法使用本文内容者,本人依法保留追究權等。