久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Runnable接口與Thread類(lèi)的區(qū)別

 燮羽 2010-12-19

什么時(shí)候讓線(xiàn)程實(shí)現(xiàn)Runnable接口,,什么時(shí)候讓線(xiàn)程繼承Thread類(lèi),?

JDK幫助文檔中的原話(huà):Runnable 接口應(yīng)該由那些打算通過(guò)某一線(xiàn)程執(zhí)行其實(shí)例的類(lèi)來(lái)實(shí)現(xiàn)
(不明白是啥意思)
孫鑫老師的原話(huà):當(dāng)不需要改變一個(gè)線(xiàn)程中除了run()方法以外的其他方法時(shí),讓線(xiàn)程實(shí)現(xiàn)Runnable接口,。
(明白是什么意思,,但不知道有什么用      汗!!!)

如果讓一個(gè)線(xiàn)程實(shí)現(xiàn)Runnable接口,那么當(dāng)調(diào)用這個(gè)線(xiàn)程的對(duì)象開(kāi)辟多個(gè)線(xiàn)程時(shí),,可以讓這些線(xiàn)程調(diào)用同一個(gè)變量;若這個(gè)線(xiàn)程是由繼承Thread類(lèi)而來(lái),,則要通過(guò)內(nèi)部類(lèi)來(lái)實(shí)現(xiàn)上述功能,,利用的就是內(nèi)部類(lèi)可任意訪問(wèn)外部變量這一特性。
例子程序:
public class ThreadTest
{
public static void main(String[] args)
{
   MyThread mt=new MyThread();
   new Thread(mt).start();     //通過(guò)實(shí)現(xiàn)Runnable的類(lèi)的對(duì)象來(lái)開(kāi)辟第一個(gè)線(xiàn)程
   new Thread(mt).start();     //通過(guò)實(shí)現(xiàn)Runnable的類(lèi)的對(duì)象來(lái)開(kāi)辟第二個(gè)線(xiàn)程
   new Thread(mt).start();     //通過(guò)實(shí)現(xiàn)Runnable的類(lèi)的對(duì)象來(lái)開(kāi)辟第三個(gè)線(xiàn)程
   //由于這三個(gè)線(xiàn)程是通過(guò)同一個(gè)對(duì)象mt開(kāi)辟的,,所以run()里方法訪問(wèn)的是同一個(gè)index
}
}

class MyThread implements Runnable    //實(shí)現(xiàn)Runnable接口
{
int index=0;
public void run()
{
   for(;index<=200;)
    System.out.println(Thread.currentThread().getName()+":"+index++);
}
}

------------------------------------------------------------------------------------------------------------------------------------

public class ThreadTest
{
public static void main(String[] args)
{
   MyThread mt=new MyThread();
   mt.getThread().start();       //通過(guò)返回內(nèi)部類(lèi)的對(duì)象來(lái)開(kāi)辟第一個(gè)線(xiàn)程
   mt.getThread().start();      //通過(guò)返回內(nèi)部類(lèi)的對(duì)象來(lái)開(kāi)辟第二個(gè)線(xiàn)程
   mt.getThread().start();      //通過(guò)返回內(nèi)部類(lèi)的對(duì)象來(lái)開(kāi)辟第三個(gè)線(xiàn)程
   //由于這三個(gè)線(xiàn)程是通過(guò)同一個(gè)匿名對(duì)象來(lái)開(kāi)辟的,,所以run()里方法訪問(wèn)的是同一個(gè)index
}
}

class MyThread
{
int index=0;
private class InnerClass extends Thread    //定義一個(gè)內(nèi)部類(lèi),繼承Thread
{
   public void run()
   {
    for(;index<=200;)
     System.out.println(getName()+":"+index++);
   }
}
Thread getThread()     //這個(gè)函數(shù)的作用是返回InnerClass的一個(gè)匿名對(duì)象
{
   return new InnerClass();
}
}
//這里有一個(gè)問(wèn)題:如果內(nèi)部類(lèi)要訪問(wèn)一個(gè)外部變量或方法,,那么這個(gè)變量或方法必須定義為final,,但為什么這里的變量index不用定義為final就可以被內(nèi)部類(lèi)訪問(wèn)?
 

Thread和Runnable

1,、 認(rèn)識(shí)Thread和Runnable

Java中實(shí)現(xiàn)多線(xiàn)程有兩種途徑:繼承Thread類(lèi)或者實(shí)現(xiàn)Runnable接口,。Runnable是接口,建議用接口的方式生成線(xiàn)程,,因?yàn)榻涌诳梢詫?shí)現(xiàn)多繼承,,況且Runnable只有一個(gè)run方法,很適合繼承。在使用Thread的時(shí)候只需繼承Thread,,并且new一個(gè)實(shí)例出來(lái),,調(diào)用 start()方法即可以啟動(dòng)一個(gè)線(xiàn)程。

Thread Test = new Thread();

Test.start();

在使用Runnable的時(shí)候需要先new一個(gè)實(shí)現(xiàn)Runnable的實(shí)例,,之后啟動(dòng)Thread即可,。

Test impelements Runnable;

Test t = new Test();

Thread test = new Thread(t);

test.start();

總結(jié):Thread和Runnable是實(shí)現(xiàn)java多線(xiàn)程的2種方式,runable是接口,,thread是類(lèi),,建議使用runable實(shí)現(xiàn) java多線(xiàn)程,不管如何,,最終都需要通過(guò)thread.start()來(lái)使線(xiàn)程處于可運(yùn)行狀態(tài),。

2、 認(rèn)識(shí)Thread的start和run

1) start:

用start方法來(lái)啟動(dòng)線(xiàn)程,,真正實(shí)現(xiàn)了多線(xiàn)程運(yùn)行,,這時(shí)無(wú)需等待run方法體代碼執(zhí)行完畢而直接繼續(xù)執(zhí)行下面的代碼。通過(guò)調(diào)用Thread類(lèi)的 start()方法來(lái)啟動(dòng)一個(gè)線(xiàn)程,,這時(shí)此線(xiàn)程處于就緒(可運(yùn)行)狀態(tài),,并沒(méi)有運(yùn)行,一旦得到cpu時(shí)間片,,就開(kāi)始執(zhí)行run()方法,,這里方法 run()稱(chēng)為線(xiàn)程體,它包含了要執(zhí)行的這個(gè)線(xiàn)程的內(nèi)容,,Run方法運(yùn)行結(jié)束,,此線(xiàn)程隨即終止。

2) run:

run()方法只是類(lèi)的一個(gè)普通方法而已,,如果直接調(diào)用Run方法,,程序中依然只有主線(xiàn)程這一個(gè)線(xiàn)程,其程序執(zhí)行路徑還是只有一條,,還是要順序執(zhí)行,,還是要等待run方法體執(zhí)行完畢后才可繼續(xù)執(zhí)行下面的代碼,這樣就沒(méi)有達(dá)到寫(xiě)線(xiàn)程的目的,。

總結(jié):調(diào)用start方法方可啟動(dòng)線(xiàn)程,,而run方法只是thread的一個(gè)普通方法調(diào)用,還是在主線(xiàn)程里執(zhí)行,。

3,、 線(xiàn)程狀態(tài)說(shuō)明

線(xiàn)程狀態(tài)從大的方面來(lái)說(shuō),可歸結(jié)為:初始狀態(tài),、可運(yùn)行狀態(tài),、不可運(yùn)行狀態(tài)和消亡狀態(tài),具體可細(xì)分為上圖所示7個(gè)狀態(tài),說(shuō)明如下:

1) 線(xiàn)程的實(shí)現(xiàn)有兩種方式,,一是繼承Thread類(lèi),,二是實(shí)現(xiàn)Runnable接口,但不管怎樣,,當(dāng)我們new了thread實(shí)例后,,線(xiàn)程就進(jìn)入了初始狀態(tài);

2) 當(dāng)該對(duì)象調(diào)用了start()方法,,就進(jìn)入可運(yùn)行狀態(tài),;

3) 進(jìn)入可運(yùn)行狀態(tài)后,當(dāng)該對(duì)象被操作系統(tǒng)選中,,獲得CPU時(shí)間片就會(huì)進(jìn)入運(yùn)行狀態(tài),;

4) 進(jìn)入運(yùn)行狀態(tài)后case就比較多,大致有如下情形:

﹒run()方法或main()方法結(jié)束后,,線(xiàn)程就進(jìn)入終止?fàn)顟B(tài),;

﹒當(dāng)線(xiàn)程調(diào)用了自身的sleep()方法或其他線(xiàn)程的join()方法,就會(huì)進(jìn)入阻塞狀態(tài)(該狀態(tài)既停止當(dāng)前線(xiàn)程,,但并不釋放所占有的資源),。當(dāng) sleep()結(jié)束或join()結(jié)束后,該線(xiàn)程進(jìn)入可運(yùn)行狀態(tài),,繼續(xù)等待OS分配時(shí)間片,;

﹒當(dāng)線(xiàn)程剛進(jìn)入可運(yùn)行狀態(tài)(注意,還沒(méi)運(yùn)行),,發(fā)現(xiàn)將要調(diào)用的資源被鎖牢(synchroniza,lock),,將會(huì)立即進(jìn)入鎖池狀態(tài),等待獲取鎖標(biāo)記(這時(shí)的鎖池里也許已經(jīng)有了其他線(xiàn)程在等待獲取鎖標(biāo)記,,這時(shí)它們處于隊(duì)列狀態(tài),,既先到先得),一旦線(xiàn)程獲得鎖標(biāo)記后,,就轉(zhuǎn)入可運(yùn)行狀態(tài),等待OS分配 CPU時(shí)間片,;

﹒當(dāng)線(xiàn)程調(diào)用wait()方法后會(huì)進(jìn)入等待隊(duì)列(進(jìn)入這個(gè)狀態(tài)會(huì)釋放所占有的所有資源,,與阻塞狀態(tài)不同),進(jìn)入這個(gè)狀態(tài)后,,是不能自動(dòng)喚醒的,,必須依靠其他線(xiàn)程調(diào)用notify()或notifyAll()方法才能被喚醒(由于notify()只是喚醒一個(gè)線(xiàn)程,但我們由不能確定具體喚醒的是哪一個(gè)線(xiàn)程,,也許我們需要喚醒的線(xiàn)程不能夠被喚醒,,因此在實(shí)際使用時(shí),一般都用notifyAll()方法,喚醒有所線(xiàn)程),,線(xiàn)程被喚醒后會(huì)進(jìn)入鎖池,,等待獲取鎖標(biāo)記。

﹒當(dāng)線(xiàn)程調(diào)用stop方法,,即可使線(xiàn)程進(jìn)入消亡狀態(tài),,但是由于stop方法是不安全的,不鼓勵(lì)使用,,大家可以通過(guò)run方法里的條件變通實(shí)現(xiàn)線(xiàn)程的 stop,。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,,不代表本站觀點(diǎn),。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,,謹(jǐn)防詐騙,。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶(hù) 評(píng)論公約

    類(lèi)似文章 更多