java中的多線程是一個同時執(zhí)行多個線程的過程。
線程基本上是一個輕量級的子進(jìn)程,是最小的處理單元。多處理和多線程,都用于實現(xiàn)多任務(wù)處理。
但是我們使用多線程而不是多處理,因為線程共享一個公共內(nèi)存區(qū)域。它們不分配單獨的內(nèi)存區(qū)域,因此節(jié)省了內(nèi)存,并且線程之間的上下文切換花費的時間少于進(jìn)程。
Java多線程主要用于游戲,動畫等
Java多線程的優(yōu)點
1)它不會阻止用戶,因為線程是獨立的,您可以同時執(zhí)行多個操作。
2)您可以一起執(zhí)行許多操作,因此可以節(jié)省時間。
3)線程是獨立的,如果單線程中發(fā)生異常,它不會影響其他線程。
多任務(wù)處理
多任務(wù)是同時執(zhí)行多個任務(wù)的過程。我們使用多任務(wù)來利用CPU。多任務(wù)可以通過兩種方式實現(xiàn):
基于過程的多任務(wù)(多處理)
基于線程的多任務(wù)(多線程)
1)基于過程的多任務(wù)(多處理)
每個進(jìn)程在內(nèi)存中都有自己的地址,即每個進(jìn)程分配單獨的內(nèi)存區(qū)域。
過程是重量級的。
過程之間的溝通成本很高。
從一個進(jìn)程切換到另一個進(jìn)程需要一些時間來保存和加載寄存器,內(nèi)存映射,更新列表等。
2)基于線程的多任務(wù)(多線程)
線程共享相同的地址空間。
線程輕量級。
線程之間的通信成本很低。
什么是Java中的線程
線程是一個輕量級的子進(jìn)程,是最小的處理單元。這是一個獨立的執(zhí)行路徑。
線程是獨立的,如果在一個線程中發(fā)生異常,它不會影響其他線程。它共享一個共同的內(nèi)存區(qū)域。
線程的生命周期(線程狀態(tài))
一個線程可以處于五個狀態(tài)之一。根據(jù)sun的說法,javanew中線程生命周期中只有4個狀態(tài),可運行,不可運行和終止。沒有運行狀態(tài)。
但為了更好地理解這些線索,我們正在5個州進(jìn)行解釋。
Java中線程的生命周期由JVM控制。java線程狀態(tài)如下所示:
- New
- Runnable
- Running
- Non-Runnable(Blocked)
- Terminated
1)New
如果創(chuàng)建Thread類的實例,但在調(diào)用start()方法之前,線程處于新狀態(tài)。
2)Runnable
線程在調(diào)用start()方法后處于可運行狀態(tài),但線程調(diào)度程序沒有選擇它作為正在運行的線程。
3)Running
如果線程調(diào)度程序選擇了線程,線程將處于運行狀態(tài)。
4)Non-Runnable(Blocked)
這是線程仍然活著時的狀態(tài),但目前沒有資格運行。
5)Terminated
當(dāng)其run()方法退出時,線程處于終止或死態(tài)。
如何創(chuàng)建線程
有兩種方法可以創(chuàng)建一個線程:
通過擴(kuò)展Thread類
通過實現(xiàn)Runnable接口。
線程類:
Thread類提供構(gòu)造函數(shù)和方法來創(chuàng)建和執(zhí)行一個線程上的操作.Thread類擴(kuò)展了Object類并實現(xiàn)了Runnable接口。
Thread類的常用構(gòu)造函數(shù):
- Thread()
- Thread(Stringname)
- Thread(Runnabler)
- Thread(Runnabler,Stringname)
Thread類的常用方法:
publicvoidrun():用于為線程執(zhí)行操作。
publicvoidstart():啟動線程的執(zhí)行.JVM調(diào)用線程上的run()方法。
publicvoidsleep(longmiliseconds):使當(dāng)前正在執(zhí)行的線程休眠(暫時停止執(zhí)行)達(dá)指定的毫秒數(shù)。
publicvoidjoin():等待線程死亡。
publicvoidjoin(longmiliseconds):等待一個線程在指定的毫秒內(nèi)死亡。
publicintgetPriority():返回線程的優(yōu)先級。
publicintsetPriority(intpriority):更改線程的優(yōu)先級。
publicStringgetName():返回線程的名稱。
publicvoidsetName(Stringname):更改線程的名稱。
公共線程currentThread():返回當(dāng)前正在執(zhí)行的線程的引用。
publicintgetId():返回線程的ID。
publicThread.StategetState():返回線程的狀態(tài)。
publicbooleanisAlive():測試線程是否存在。
publicvoidyield():導(dǎo)致當(dāng)前正在執(zhí)行的線程對象暫時暫停并允許其他線程執(zhí)行。
publicvoidsuspend():用于掛起線程(depricated)。
publicvoidresume():用于恢復(fù)掛起的線程(depricated)。
publicvoidstop():用于停止線程(depricated)。
publicbooleanisDaemon():測試線程是否是守護(hù)進(jìn)程線程。
publicvoidsetDaemon(booleanb):將線程標(biāo)記為守護(hù)進(jìn)程或用戶線程。
publicvoidinterrupt():中斷線程。
publicbooleanisInterrupted():測試線程是否被中斷。
publicstaticbooleaninterrupted():測試當(dāng)前線程是否被中斷。
可運行界面:
Runnable接口應(yīng)該由其實例旨在由線程執(zhí)行的任何類來實現(xiàn)。Runnable接口只有一個名為run()的方法。
publicvoidrun():用于為線程執(zhí)行操作。
開始一個線程:
Thread類的start()方法用于啟動新創(chuàng)建的線程。它執(zhí)行以下任務(wù):
一個新線程開始(使用新的callstack)。
線程從New狀態(tài)移動到Runnable狀態(tài)。
當(dāng)線程有機(jī)會執(zhí)行時,其目標(biāo)run()方法將運行。
1)擴(kuò)展Thread類的Java線程示例
2)通過實現(xiàn)Runnable接口的Java線程示例
如果你不擴(kuò)展Thread類,你的類對象不會被當(dāng)作線程對象。所以你需要明確地創(chuàng)建Thread類object.We傳遞你的類的實現(xiàn)Runnable的對象,以便你的類run()方法可能會執(zhí)行。
Java中的線程調(diào)度程序
線程schedulerinjava是決定哪個線程應(yīng)該運行的JVM的一部分。
不能保證哪個可運行的線程將被線程調(diào)度器選擇運行。
一次只能有一個線程在單個進(jìn)程中運行。
線程調(diào)度器主要使用搶占或時間片調(diào)度來調(diào)度線程。
搶先調(diào)度和時間分割之間的區(qū)別
在搶先式調(diào)度下,執(zhí)行最高優(yōu)先級的任務(wù),直到它進(jìn)入等待狀態(tài)或死亡狀態(tài),或者產(chǎn)生更高優(yōu)先級的任務(wù)。在時間分割下,任務(wù)執(zhí)行預(yù)定義的時間片,然后重新進(jìn)入準(zhǔn)備好的任務(wù)池。然后,調(diào)度程序根據(jù)優(yōu)先級和其他因素確定下一個要執(zhí)行的任務(wù)。
java中的睡眠方法
Thread類的sleep()方法用于在指定的時間內(nèi)休眠一個線程。
java中sleep()方法的語法
Thread類提供了兩種睡眠線程的方法:
publicstaticvoidsleep(longmiliseconds)throwsInterruptedException
publicstaticvoidsleep(longmiliseconds,intnanos)throwsInterruptedException
java中的睡眠方法示例
正如你所知道的那樣,一次只有一個線程被執(zhí)行。如果你在指定的時間睡了一個線程,線程漏斗會拾取另一個線程,如此等等。
我們可以開始一個線程兩次嗎?
不可以。啟動線程后,永遠(yuǎn)不會再次啟動。如果你這樣做了,拋出一個IllegalThreadStateException異常。在這種情況下,線程將運行一次但第二次,它會拋出異常。
讓我們通過下面的例子來理解它:
如果我們直接調(diào)用run()方法而不是start()方法呢?
每個線程都在單獨的調(diào)用堆棧中啟動。
從主線程調(diào)用run()方法,run()方法會進(jìn)入當(dāng)前調(diào)用堆棧而不是新調(diào)用堆棧的開始處。
問題是如果你直接調(diào)用run()方法
正如你在上面的程序中看到的那樣,沒有上下文切換,因為在這里t1和t2將被視為普通對象而不是線程對象。
以上就是天津卓眾教育Java培訓(xùn)機(jī)構(gòu)小編介紹的“Java多線程基礎(chǔ)開發(fā)詳細(xì)教程”的內(nèi)容,希望能夠幫助到大家,更多Java資訊最新內(nèi)容請繼續(xù)關(guān)注天津卓眾教育Java培訓(xùn)機(jī)構(gòu)官網(wǎng),每天會有精彩內(nèi)容分享與你。
Java基礎(chǔ)教程 Java開發(fā)教程