多線程概念:線程是進程中執行運算的最小單位,是進程中的一個實體,是被系統獨立調度和分派的基本單位,線程自己不擁有系統資源,只擁有一點在運行中必不可少的資源,但它可與同屬一個進程的其它線程共享進程所擁有的全部資源。一個線程可以創建和撤消另一個線程,同一進程中的多個線程之間可以併發執行。其實平時我們啓動程序,其實是啓動的進程,但是在往下細分的話,其實是進程的一個或者多個線程完成的功能。
主線程:當一個程序啓動時,就有一個進程被操作系統(OS)創建,與此同時一個線程也立刻運行,該線程通常叫做程序的主線程(Main Thread)。每個進程至少都有一個主線程,主線程通常最後關閉。
子線程:在程序中創建的其他線程,相對於主線程來說就是這個主線程的子線程。
並行:任務數小於或等於cpu的核數,是真正意義上一起執行
併發:任務數大於cpu核數,多個任務交替執行
線程執行的時候是無序的,由cpu調度決定的
線程執行過程中,主線程會等待所有子線程執行完成用戶程序再退出
好處 :(1)易於調度。
(2)提高併發性。通過線程可方便有效地實現併發性。進程可創建多個線程來執行同一程序的不同部分。
(3)開銷少。創建線程比創建進程要快,所需開銷很少。
(4)利於充分發揮多處理器的功能。通過創建多線程進程,每個線程在一個處理器上運行,從而實現應用程序的併發性,
使每個處理器都得到充分運行。
線程的生命週期
各個狀態的說明如下:
1.new新建。新創建的線程經過初始化後,進入Runnable狀態。
2.Runnable就緒。等待線程調度。調度後進入運行狀態。
3.Running運行。
4.Blocked阻塞,暫停運行,解除阻塞後進入Runnable狀態重新等待調度。
5.Dead消亡。線程方法執行完畢返回或者異常終止。
可能有3種情況從Running進入Blocked:
同步:線程中獲取同步鎖,但是資源已經被其他線程鎖定時,進入Locked狀態,直到該資源可獲取(獲取的順序由Lock隊列控制)
睡眠:線程運行sleep()或join()方法後,線程進入Sleeping狀態。區別在於sleep等待固定的時間,而join是等待子線程執行完。當然join也可以指定一個“超時時間”。從語義上來說,如果兩個線程a,b, 在a中調用b.join(),相當於合併(join)成一個線程。最常見的情況是在主線程中join所有的子線程。
等待:線程中執行wait()方法後,線程進入Waiting狀態,等待其他線程的通知(notify)