更新時(shí)間:2017-11-14 來源:黑馬程序員 瀏覽量:
在Java中,實(shí)現(xiàn)多線程操作有兩種方式,一種是繼承java.lang包下的Thread類,覆寫Thread類的run()方法,在run()方法中實(shí)現(xiàn)運(yùn)行在線程上的代碼。另一種就是實(shí)現(xiàn)java.lang.Runnable接口,同樣是在run()方法中實(shí)現(xiàn)運(yùn)行在線程上的代碼。兩種方式的區(qū)別在于,繼承Thread類可以直接啟動線程,實(shí)現(xiàn)Runnable接口不能直接啟動線程,需要先創(chuàng)建Thread類的實(shí)例對象,通過Thread類的構(gòu)造方法傳入實(shí)現(xiàn)了Runnable接口的實(shí)例對象,然后通過Thread類來啟動線程。因此,這兩種方式都會用到Thread類,由此可見該類在多線程中的重要性,接下來就通過一些實(shí)例針對Java中多線程的兩種創(chuàng)建方式分別進(jìn)行講解,并比較它們的優(yōu)缺點(diǎn)。
創(chuàng)建線程的第一種方式----繼承Thread類,代碼如下所示:
public class Example02 { publicstatic void main(String[] args) { Clientt2=new Client(); t2.start(); while(true) { System.out.println(Thread.currentThread().getName() +"................... Client2 is running"); } } } class Client extends Thread { publicvoid run() { while(true) { System.out.println(Thread.currentThread().getName() + "...................Client1 isrunning"); } } }
例程中,Client類繼承了Thread類,也就具有了Thread類的全部特點(diǎn),在main()方法中創(chuàng)建Client的實(shí)例對象,并調(diào)用從Thread類繼承的start()方法開啟線程,兩個(gè)while循環(huán)處的代碼交替運(yùn)行。為了方便看出哪個(gè)線程正在運(yùn)行,可以通過Thread.currentThread().getName()方法獲得當(dāng)前線程的名稱,默認(rèn)情況下,主線程的名稱為main,用戶啟動的多條線程的名稱依次為Thread-0、Thread-1、Thread-2……Thread-n等。接下來通過單線程和多線程運(yùn)行的流程圖來說明它們的區(qū)別,如下圖所示。
從圖中可知,單線程中,main()方法必須等到Client的print()方法返回后才能繼續(xù)運(yùn)行,而在多線程中,main()方法和Client的run()方法運(yùn)行在各自的線程中,互不影響。這就好比一個(gè)1G的CPU分成了兩個(gè)500M的CPU,在一個(gè)CPU上運(yùn)行main()方法,另一個(gè)CPU上運(yùn)行Client的run()方法。
大家可能會有這樣的疑問:程序沒有直接調(diào)用Client對象的run()方法,而是調(diào)用了該對象從Thread類繼承來的start()方法,那為什么會執(zhí)行run()方法呢? 這是因?yàn)閟tart()方法有兩個(gè)作用,一是開啟一個(gè)新的線程,二是調(diào)用Thread子類對象的run()方法。如果直接調(diào)用線程對象的run()方法,線程對象只是一個(gè)普通類的實(shí)例對象,新的線程并沒有開啟,run()方法中的代碼也只會在主線程中執(zhí)行。
友情提示:獲得更多學(xué)科學(xué)習(xí)視頻+資料+源碼,請加QQ:2632311208。
本文版權(quán)歸黑馬程序員JavaEE學(xué)院所有,歡迎轉(zhuǎn)載,轉(zhuǎn)載請注明作者出處。謝謝!
作者:黑馬程序員JavaEE培訓(xùn)學(xué)院
首發(fā):http://java.itheima.com/