Java多線程中start()和run()的區(qū)別

Java多線程中start()和run()的區(qū)別

Java的線程是通過(guò)java.lang.Thread類來(lái)實(shí)現(xiàn)的。VM啟動(dòng)時(shí)會(huì)有一個(gè)由主方法所定義的線程??梢酝ㄟ^(guò)創(chuàng)建Thread的實(shí)例來(lái)創(chuàng)建新的線程。每個(gè)線程都是通過(guò)某個(gè)特定Thread對(duì)象所對(duì)應(yīng)的方法run()來(lái)完成其操作的,方法run()稱為線程體。通過(guò)調(diào)用Thread類的start()方法來(lái)啟動(dòng)一個(gè)線程。

在Java當(dāng)中,線程通常都有五種狀態(tài),創(chuàng)建、就緒、運(yùn)行、阻塞和死亡:

第一是創(chuàng)建狀態(tài)。在生成線程對(duì)象,并沒有調(diào)用該對(duì)象的start方法,這是線程處于創(chuàng)建狀態(tài)。

第二是就緒狀態(tài)。當(dāng)調(diào)用了線程對(duì)象的start方法之后,該線程就進(jìn)入了就緒狀態(tài),但是此時(shí)線程調(diào)度程序還沒有把該線程設(shè)置為當(dāng)前線程,此時(shí)處于就緒狀態(tài)。在線程運(yùn)行之后,從等待或者睡眠中回來(lái)之后,也會(huì)處于就緒狀態(tài)。

第三是運(yùn)行狀態(tài)。線程調(diào)度程序?qū)⑻幱诰途w狀態(tài)的線程設(shè)置為當(dāng)前線程,此時(shí)線程就進(jìn)入了運(yùn)行狀態(tài),開始運(yùn)行run函數(shù)當(dāng)中的代碼。

第四是阻塞狀態(tài)。線程正在運(yùn)行的時(shí)候,被暫停,通常是為了等待某個(gè)事件的發(fā)生(比如說(shuō)某項(xiàng)資源就緒)之后再繼續(xù)運(yùn)行。sleep,suspend,wait等方法都可以導(dǎo)致線程阻塞。

第五是死亡狀態(tài)。如果一個(gè)線程的run方法執(zhí)行結(jié)束或者調(diào)用stop方法后,該線程就會(huì)死亡。對(duì)于已經(jīng)死亡的線程,無(wú)法再使用start方法令其進(jìn)入就緒。

實(shí)現(xiàn)并啟動(dòng)線程有兩種方法:

1、寫一個(gè)類繼承自Thread類,重寫run方法。用start方法啟動(dòng)線程

2、寫一個(gè)類實(shí)現(xiàn)Runnable接口,實(shí)現(xiàn)run方法。用new Thread(Runnable target).start()方法來(lái)啟動(dòng)

多線程原理:相當(dāng)于玩游戲機(jī),只有一個(gè)游戲機(jī)(cpu),可是有很多人要玩,于是,start是排隊(duì)!等CPU選中你就是輪到你,你就run(),當(dāng)CPU的運(yùn)行的時(shí)間片執(zhí)行完,這個(gè)線程就繼續(xù)排隊(duì),等待下一次的run()。

調(diào)用start()后,線程會(huì)被放到等待隊(duì)列,等待CPU調(diào)度,并不一定要馬上開始執(zhí)行,只是將這個(gè)線程置于可動(dòng)行狀態(tài)。然后通過(guò)JVM,線程Thread會(huì)調(diào)用run()方法,執(zhí)行本線程的線程體。先調(diào)用start后調(diào)用run,這么麻煩,為了不直接調(diào)用run?就是為了實(shí)現(xiàn)多線程的優(yōu)點(diǎn),沒這個(gè)start不行。

1.start()方法來(lái)啟動(dòng)線程,真正實(shí)現(xiàn)了多線程運(yùn)行。這時(shí)無(wú)需等待run方法體代碼執(zhí)行完畢,可以直接繼續(xù)執(zhí)行下面的代碼;通過(guò)調(diào)用Thread類的start()方法來(lái)啟動(dòng)一個(gè)線程, 這時(shí)此線程是處于就緒狀態(tài), 并沒有運(yùn)行。 然后通過(guò)此Thread類調(diào)用方法run()來(lái)完成其運(yùn)行操作的, 這里方法run()稱為線程體,它包含了要執(zhí)行的這個(gè)線程的內(nèi)容, Run方法運(yùn)行結(jié)束, 此線程終止。然后CPU再調(diào)度其它線程。

2.run()方法當(dāng)作普通方法的方式調(diào)用。程序還是要順序執(zhí)行,要等待run方法體執(zhí)行完畢后,才可繼續(xù)執(zhí)行下面的代碼; 程序中只有主線程——這一個(gè)線程, 其程序執(zhí)行路徑還是只有一條, 這樣就沒有達(dá)到寫線程的目的。

記?。憾嗑€程就是分時(shí)利用CPU,宏觀上讓所有線程一起執(zhí)行 ,也叫并發(fā)。

package basic;publicclass ThreadTest {

? ? publicstaticvoid main(String[] args) {

? ? ? ? Runner1 runner1 =new Runner1();

? ? ? ? Runner2 runner2 =new Runner2();

? ? ? ? // Thread(Runnable target) 分配新的 Thread 對(duì)象。Thread thread1 =new Thread(runner1);

? ? ? ? Thread thread2 =new Thread(runner2);

? ? ? ? thread1.start(); //執(zhí)行start,thread1與thread2交叉執(zhí)行? ? ? ? thread2.start();

? ? ? ? //thread1.run(); //執(zhí)行run,thread1與thread2順序執(zhí)行

? ? ? ? //thread2.run();? ? }

}classRunner1implementsRunnable {// 實(shí)現(xiàn)了Runnable接口,jdk就知道這個(gè)類是一個(gè)線程publicvoid run() {

? ? ? ? for(inti = 0; i < 100; i++) {

? ? ? ? ? ? System.out.println("進(jìn)入Runner1運(yùn)行狀態(tài)——————————" + i);

? ? ? ? }

? ? }

}classRunner2implementsRunnable {// 實(shí)現(xiàn)了Runnable接口,jdk就知道這個(gè)類是一個(gè)線程publicvoid run() {

? ? ? ? for(inti = 0; i < 100; i++) {

? ? ? ? ? ? System.out.println("進(jìn)入Runner2運(yùn)行狀態(tài)==========" + i);

? ? ? ? }

? ? }

}

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文主要講了java中多線程的使用方法、線程同步、線程數(shù)據(jù)傳遞、線程狀態(tài)及相應(yīng)的一些線程函數(shù)用法、概述等。 首先講...
    李欣陽(yáng)閱讀 2,593評(píng)論 1 15
  • Java多線程學(xué)習(xí) [-] 一擴(kuò)展javalangThread類 二實(shí)現(xiàn)javalangRunnable接口 三T...
    影馳閱讀 3,106評(píng)論 1 18
  • 進(jìn)程和線程 進(jìn)程 所有運(yùn)行中的任務(wù)通常對(duì)應(yīng)一個(gè)進(jìn)程,當(dāng)一個(gè)程序進(jìn)入內(nèi)存運(yùn)行時(shí),即變成一個(gè)進(jìn)程.進(jìn)程是處于運(yùn)行過(guò)程中...
    勝浩_ae28閱讀 5,256評(píng)論 0 23
  • 轉(zhuǎn)自 http://blog.csdn.net/ChatHello/article/details/6906097...
    呂品?閱讀 5,506評(píng)論 0 100
  • 一文讀懂Python多線程 1、線程和進(jìn)程 計(jì)算機(jī)的核心是CPU,它承擔(dān)了所有的計(jì)算任務(wù)。它就像一座工廠,時(shí)刻在運(yùn)...
    星丶雲(yún)閱讀 1,589評(píng)論 0 4

友情鏈接更多精彩內(nèi)容