文章目錄
- 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中的建立線程,是通過協作的方式進行管理的
- 建立線程的三種方式
- 繼承Thread 重寫 run()方法
- 實作接口 Runnable 實作 run()方法
- 實作接口 Callable 實作 call()方法,Callable可以有傳回值,Runnable沒有傳回值
-
stop(),resume(),suspend()
java多線程的設計初衷是協作式,是以現在已經不建議使用。stop()會導緻線程不會正确釋放資源,suspend()容易導緻死鎖。這些都是強制關閉或暫停的手段。
-
interrupt(),isInterrupted(),Thread.Interrupted()
調用interrupt(),會将線程内的辨別位制位true這是需要程式員手動通過isInterrupted()方法或者靜态方法Thread.Interrupted()去判斷辨別位是否為true 進而停止線程執行。
Thread.Interrupted()會在判斷完成後預設将狀态辨別制為false。
我們也可以自己寫一個辨別變量,完成線程的停止。值得一提的是,我們自己寫的辨別,無法将線程從等待狀态立馬喚醒,也就是說如果有Thread.Sleep(),那麼我們自己寫的辨別判斷必須等到sleep結束後才能執行。
-
yield()
讓正在執行的線程,讓出目前時間片的執行權,重新競争時間片。是以下個時間片任然有可能會執行該線程。
-
priority
設定線程優先級,取值範圍是[1,10],預設值為5。但線程的優先級不可靠,由作業系統控制,不建議作為線程開發時候的手段。
-
daemon
設定守護線程,守護線程與主線程同時結束,如果如主線程結束時,守護線程正在執行,則停止守護線程。這種停止是不會觸發finally()的
-
join
線程A,執行了線程B的join方法,線程A必須要等待B執行完成了以後,線程A才能繼續自己的工作。
轉載申明
- 部落格中标注原創的文章,版權歸原作者 kkgggkg 所有;
- 未經原作者允許不得轉載本文内容,否則将視為侵權;
- 轉載或者引用本文内容請注明來源及原作者;
- 對于不遵守此聲明或者其他違法使用本文内容者,本人依法保留追究權等。