更新時間:2020-04-03 16:04:06 來源:動力節(jié)點 瀏覽3491次
1.1. 線程生命周期和狀態(tài)(重點)
新建:當(dāng)程序使用new創(chuàng)建一個線程后,該線程處于新建狀態(tài),此時他和其他java對象一樣,僅僅由Java虛擬機為其分配內(nèi)存并初始化成員變量值。
可運行狀態(tài):RUNNABLE狀態(tài)實際上可細(xì)分成兩種狀態(tài),READY和RUNNING。分別表示就緒狀態(tài)和運行狀態(tài)。
就緒狀態(tài):當(dāng)線程對象調(diào)用start()方法后,該線程處于就緒狀態(tài),進(jìn)入線程隊列排隊。此時該狀態(tài)線程并未開始執(zhí)行,僅表示可以運行了。至于該線程何時運行,取決于CPU調(diào)度器的調(diào)度。
運行狀態(tài):表示某線程對象被CPU調(diào)度器的調(diào)度,執(zhí)行線程體。就緒狀態(tài)和運行狀態(tài)是可以相互切換的,切換的原因依舊參照CPU調(diào)度器調(diào)度了哪一個線程。
阻塞狀態(tài):正在運行的線程遇到某個特殊情況如,同步、等待I/O操作完成等。 進(jìn)入阻塞狀態(tài)的線程讓出CPU資源,并暫時停止自己的執(zhí)行。
等待狀態(tài):有時一個可運行狀態(tài)線程轉(zhuǎn)變成等待狀態(tài),它會等待另一個線程來執(zhí)行一個任務(wù),一個等待狀態(tài)的線程只有通過另一個線程通知它轉(zhuǎn)到可運行狀態(tài),才能繼續(xù)執(zhí)行。
計時等待狀態(tài):進(jìn)入等待狀態(tài)的線程如果沒有其他線程對象來喚醒它,那么該線程對象將一直等待下去,此時我們可以考慮設(shè)計一個類似于鬧鐘一樣的提示器,該提示器會在等待特定時間段之后喚醒該線程對象。
終止?fàn)顟B(tài):即死亡狀態(tài),表示線程終止。當(dāng)線程成功執(zhí)行完成或線程拋出未捕獲的Exception或Error或調(diào)用線程的stop方法(易導(dǎo)致死鎖,不推薦)。
1.2. 操作線程的方法(掌握)
1.2.1. join方法(了解)
join方法的主要作用就是同步,它可以使得線程之間的并行執(zhí)行變?yōu)榇袌?zhí)行。
比如在A線程中調(diào)用了B線程的join()方法時,表示只有當(dāng)B線程執(zhí)行完畢時,A線程才能繼續(xù)執(zhí)行。
1.2.2. sleep方法(了解)
sleep方法讓正在執(zhí)行的線程暫停一段時間,進(jìn)入阻塞狀態(tài),常常用來模擬網(wǎng)絡(luò)延遲等。
sleep(long milllis) throws InterruptedException:毫秒為單位
調(diào)用sleep()后,在指定時間段之內(nèi),該線程不會獲得執(zhí)行的機會
1.2.3. 線程的優(yōu)先級(了解)
每個線程都有優(yōu)先級,優(yōu)先級的高低只和線程獲得執(zhí)行機會的次數(shù)多少有關(guān)。并不是說優(yōu)先級高的就一定先執(zhí)行,哪個線程的先運行取決于CPU的調(diào)度;
Thread對象的setPriority(int x)和getPriority()用來設(shè)置和獲得優(yōu)先級。
1.2.4. 后臺線程(了解)
所謂后臺線程,一般用于為其他線程提供服務(wù)。也稱為守護(hù)線程。JVM的垃圾回收就是典型的后臺線程。
特點:若所有的前臺線程都死亡,后臺線程自動死亡。
Thread對象setDaemon(true)用來設(shè)置后臺線程。
setDaemon(true)必須在start()調(diào)用前,否則拋IllegalThreadStateException異常。
2. 線程安全性
2.1. 繼承方式VS實現(xiàn)方式(掌握)
當(dāng)多線程并發(fā)訪問同一個資源時,會導(dǎo)致線程出現(xiàn)安全性的原因,看案例。
案例:現(xiàn)有50個蘋果,現(xiàn)在有請三個童鞋(小A、小B、小C)上臺表演吃蘋果。
因為A、B、C三個人可以同時吃蘋果,此時得使用多線程技術(shù)來實現(xiàn)這個案例。
分析: 可以定義三個線程對象,并啟動線程.
第一步:每一個同學(xué)吃蘋果的時候:先展示自己拿到手上蘋果的編號,如1,2,3,36...
第二步:再吃掉蘋果(意味著蘋果的總數(shù)少一個)
方式1:可以使用繼承Thread方式來實現(xiàn).
方式2:可以使用實現(xiàn)Runnable方式來實現(xiàn).
使用繼承方式
使用繼承方式完成該案例的時候,會發(fā)現(xiàn)A、B、C都各自吃了50個蘋果,為何?
使用實現(xiàn)方式
在使用實現(xiàn)方式的時候,我們發(fā)現(xiàn)A、B、C一共吃了50個蘋果,為何?
通過吃蘋果比賽,分析繼承方式和實現(xiàn)方式的區(qū)別:
繼承方式:
Java中類是單繼承的,如果繼承了Thread了,該類就不能再有其他的直接父類了。
從操作上分析,繼承方式更簡單,獲取線程名字也簡單。
從多線程共享同一個資源上分析,繼承方式不能多個線程共享同一個資源。
實現(xiàn)方式:
Java中類可以多實現(xiàn)接口,此時該類還可以繼承其他類,并且還可以實現(xiàn)其他接口(設(shè)計上,更優(yōu)雅)。
從操作上分析,獲取線程名字也比較復(fù)雜,得使用Thread.currentThread()來獲取當(dāng)前線程的引用。
從多線程共享同一個資源上分析,實現(xiàn)方式可以多線程共享同一個資源。
以上就是動力節(jié)點java培訓(xùn)機構(gòu)的小編針對“Java基礎(chǔ)學(xué)習(xí):java變量生命周期”的內(nèi)容進(jìn)行的回答,希望對大家有所幫助,如有疑問,請在線咨詢,有專業(yè)老師隨時為你服務(wù)。
相關(guān)閱讀
初級 202925
初級 203221
初級 202629
初級 203743