關(guān)于Java創(chuàng)建線程的2種方式以及對(duì)比
Java中兩種創(chuàng)建線程的方式:
1. 繼承Thread類
重寫(xiě)run()方法
new一個(gè)線程對(duì)象
調(diào)用對(duì)象的start()啟動(dòng)線程
class Handler extends Thread{ public void run(){ //重寫(xiě)run()方法 } public static void main(String[] args){ Thread thread=new Handler();//創(chuàng)建線程對(duì)象 thread.start();//啟動(dòng)線程 } }
2. 實(shí)現(xiàn)Runnable接口:
實(shí)現(xiàn)run()方法
創(chuàng)建一個(gè)Runnable類的對(duì)象 r,new Runnable()
創(chuàng)建Thread類對(duì)象并將Runnable對(duì)象作為參數(shù),new Thread®
調(diào)用Thread()對(duì)象的start()啟動(dòng)線程
class Handler implements Runnable{ public void run(){ //重寫(xiě)run()方法 } public static void main(String[] args){ //創(chuàng)建線程對(duì)象 Handler handler=new Handler(); Thread thread=new Thread(handler); //啟動(dòng)線程 thread.start(); } }
創(chuàng)建線程的兩種方式對(duì)比:
繼承Thread類:
- 優(yōu)點(diǎn):編寫(xiě)簡(jiǎn)單,如果需要訪問(wèn)當(dāng)前線程直接使用this即可獲得當(dāng)前線程
- 缺點(diǎn):線程類已經(jīng)繼承了Thread類,不能再繼承其它的父類
實(shí)現(xiàn)Runnable接口:
- 優(yōu)點(diǎn):線程類只實(shí)現(xiàn)了Runnable接口,還可以繼承其他的類??梢詫?shí)現(xiàn)多個(gè)線程共享一個(gè)目標(biāo)對(duì)象,非常適合多個(gè)相同線程來(lái)處理同一份資源的情況。
- 缺點(diǎn):編程稍微復(fù)雜,需要訪問(wèn)當(dāng)前線程,必須使用Thread.currentThread()方法
線程的完整生命周期:
線程的執(zhí)行通常是Java虛擬機(jī)來(lái)調(diào)度的,調(diào)度線程發(fā)送給cpu指令,取得cpu的使用權(quán),cpu在一個(gè)時(shí)刻只能執(zhí)行一條指令,線程得到了cpu的時(shí)間片,也就是使用權(quán)后再繼續(xù)執(zhí)行。
六種裝態(tài):
起始狀態(tài):采用new對(duì)象創(chuàng)建完成時(shí);
可運(yùn)行狀態(tài):線程對(duì)象調(diào)用調(diào)用了start()方法,進(jìn)入到可運(yùn)行狀態(tài),等待獲取時(shí)間片,運(yùn)行;
運(yùn)行狀態(tài):得到CPU的時(shí)間片,執(zhí)行中,運(yùn)行中可能會(huì)有優(yōu)先級(jí)更高的線程需要執(zhí)行,丟失時(shí)間片回到可運(yùn)行狀態(tài),再等待獲取時(shí)間片;
阻塞狀態(tài):發(fā)生阻塞事件時(shí),如當(dāng)前線程調(diào)用Thread.sleep()方法、或者當(dāng)前線程調(diào)用另一線程的join()的方法,或者調(diào)用了Thread.yield()方法時(shí),當(dāng)前線程都會(huì)進(jìn)入到阻塞狀態(tài)。直到解除阻塞狀態(tài),重新進(jìn)入到到可運(yùn)行狀態(tài),等待運(yùn)行;
鎖池狀態(tài):當(dāng)前線程執(zhí)行到有一個(gè)對(duì)象有synchronized 標(biāo)記的方法時(shí),當(dāng)前線程進(jìn)入到鎖池狀態(tài),其他線程也要訪問(wèn)有synchronize標(biāo)記的這個(gè)語(yǔ)句塊時(shí),暫時(shí)都先進(jìn)入到【等待隊(duì)列】,只有當(dāng)前線程執(zhí)行完畢或者調(diào)用了notify()或者notifyAll()方法時(shí),其他線程才能進(jìn)入到鎖池狀態(tài),準(zhǔn)備獲得鎖標(biāo)記,進(jìn)行執(zhí)行操作。當(dāng)然如果當(dāng)前線程執(zhí)行了wait()方法,與sleep不同,當(dāng)前線程就會(huì)放棄所有的資源,進(jìn)入到等待對(duì)列,等待有其他線程調(diào)用notify()和notifyAll()時(shí)進(jìn)行激活。
終止?fàn)顟B(tài):退出了run()方法,就是終止?fàn)顟B(tài)了。
這就是一個(gè)線程的完整的生命周期。
總結(jié)
到此這篇關(guān)于Java創(chuàng)建線程的2種方式以及對(duì)比的文章就介紹到這了,更多相關(guān)Java創(chuàng)建線程方式內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java項(xiàng)目的目錄結(jié)構(gòu)詳解
本文主要介紹了Java項(xiàng)目的目錄結(jié)構(gòu)詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-02-02Java?Mybatis使用resultMap時(shí),屬性賦值順序錯(cuò)誤的巨坑
這篇文章主要介紹了Java?Mybatis使用resultMap時(shí),屬性賦值順序錯(cuò)誤的巨坑,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01Java組件FileUpload上傳文件實(shí)現(xiàn)代碼
這篇文章主要為大家詳細(xì)介紹了Java組件FileUpload上傳文件實(shí)現(xiàn)代碼,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-06-06idea?maven?經(jīng)常主目錄自動(dòng)變回默認(rèn)的解決方法
很多朋友反映idea?maven?經(jīng)常主目錄自動(dòng)變回默認(rèn),遇到這樣的問(wèn)題真的很頭疼,該如何解決呢?下面小編給大家介紹下idea?maven目錄變回默認(rèn)的解決方法,需要的朋友可以參考下2022-08-08Java手機(jī)號(hào)碼工具類示例詳解(判斷運(yùn)營(yíng)商、獲取歸屬地)
這篇文章主要介紹了Java手機(jī)號(hào)碼工具類示例詳解,通過(guò)手機(jī)號(hào)碼來(lái)判斷運(yùn)營(yíng)商獲取歸屬地,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-02-02java判斷今天,昨天,前天,不能用秒間隔的簡(jiǎn)單實(shí)例
下面小編就為大家?guī)?lái)一篇java判斷今天,昨天,前天,不能用秒間隔的簡(jiǎn)單實(shí)例。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-03-03