導航:首頁 > 編程語言 > threadjavarunnable

threadjavarunnable

發布時間:2025-09-18 07:50:16

『壹』 java中Runnable和Thread的區別

線程的起動並不是簡單的調用了你的RUN方法,而是由一個線程調度器來分別調用你的所有線程的RUN方法,
我們普通的RUN方法如果沒有執行完是不會返回的,也就是會一直執行下去,這樣RUN方法下面的方法就不可能會執行了,可是線程里的RUN方法卻不一樣,它只有一定的CPU時間,執行過後就給別的線程了,這樣反復的把CPU的時間切來切去,因為切換的速度很快,所以我們就感覺是很多線程在同時運行一樣.

你簡單的調用run方法是沒有這樣效果的,所以你必須調用Thread類的start方法來啟動你的線程.所以你啟動線程有兩種方法
一是寫一個類繼承自Thread類,然後重寫裡面的run方法,用start方法啟動線程
二是寫一個類實現Runnable介面,實現裡面的run方法,用newThread(Runnabletarget).start()方法來啟動

這兩種方法都必須實現RUN方法,這樣線程起動的時候,線程管理器好去調用你的RUN方法.

你的TestThread沒有繼承自Thread類,怎麼可能會有start方法呢?


在java中可有兩種方式實現多線程,一種是繼承Thread類,一種是實現Runnable介面;
Thread類是在java.lang包中定義的。一個類只要繼承了Thread類同時覆寫了本類中的
run()方法就可以實現多線程操作了,但是一個類只能繼承一個父類,這是此方法的局限,
下面看例子:
packageorg.thread.demo;
classMyThreadextendsThread{
privateStringname;
publicMyThread(Stringname){
super();
this.name=name;
}
publicvoidrun(){
for(inti=0;i<10;i++){
System.out.println("線程開始:"+this.name+",i="+i);
}
}
}
packageorg.thread.demo;
publicclassThreadDemo01{
publicstaticvoidmain(String[]args){
MyThreadmt1=newMyThread("線程a");
MyThreadmt2=newMyThread("線程b");
//thread1,thread2,按順序進行
mt1.run();
mt2.run();
}
}
但是,此時結果很有規律,先第一個對象執行,然後第二個對象執行,並沒有相互運行。在JDK的文檔中可以發現,一旦調用start()方法,則會通過JVM找到run()方法。下面啟動
start()方法啟動線程:
packageorg.thread.demo;
publicclassThreadDemo01{
publicstaticvoidmain(String[]args){
MyThreadmt1=newMyThread("線程a");
MyThreadmt2=newMyThread("線程b");
//亂序進行
mt1.start();
mt2.start();
}
};
這樣程序可以正常完成互動式運行。那麼為啥非要使用start()方法啟動多線程呢?
在JDK的安裝路徑下,src.zip是全部的java源程序,通過此代碼找到Thread中的start()方法的定義,可以發現此方法中使用了privatenativevoidstart0();其中native關鍵字表示可以調用操作系統的底層函數,那麼這樣的技術成為JNI技術(javaNativeInterface)
·Runnable介面
在實際開發中一個多線程的操作很少使用Thread類,而是通過Runnable介面完成。
publicinterfaceRunnable{
publicvoidrun();
}
例子:
packageorg.runnable.demo;
{
privateStringname;
publicMyThread(Stringname){
this.name=name;
}
publicvoidrun(){
for(inti=0;i<100;i++){
System.out.println("線程開始:"+this.name+",i="+i);
}
}
};


但是在使用Runnable定義的子類中沒有start()方法,只有Thread類中才有。此時觀察Thread類,有一個構造方法:publicThread(Runnabletarget)
此構造方法接受Runnable的子類實例,也就是說可以通過Thread類來啟動Runnable實現的多
線程。(start()可以協調系統的資源):
packageorg.runnable.demo;
importorg.runnable.demo.MyThread;
publicclassThreadDemo01{
publicstaticvoidmain(String[]args){
MyThreadmt1=newMyThread("線程a");
MyThreadmt2=newMyThread("線程b");
newThread(mt1).start();
newThread(mt2).start();
}
}
·兩種實現方式的區別和聯系:
在程序開發中只要是多線程肯定永遠以實現Runnable介面為主,因為實現Runnable介面相比
繼承Thread類有如下好處:
->避免點繼承的局限,一個類可以繼承多個介面。
->適合於資源的共享
以賣票程序為例,通過Thread類完成:
packageorg.demo.dff;
classMyThreadextendsThread{
privateintticket=10;
publicvoidrun(){
for(inti=0;i<20;i++){
if(this.ticket>0){
System.out.println("賣票:ticket"+this.ticket--);
}
}
}
};
下面通過三個線程對象,同時賣票:
packageorg.demo.dff;
publicclassThreadTicket{
publicstaticvoidmain(String[]args){
MyThreadmt1=newMyThread();
MyThreadmt2=newMyThread();
MyThreadmt3=newMyThread();
mt1.start();//每個線程都各賣了10張,共賣了30張票
mt2.start();//但實際只有10張票,每個線程都賣自己的票
mt3.start();//沒有達到資源共享
}
}
如果用Runnable就可以實現資源共享,下面看例子:
packageorg.demo.runnable;
{
privateintticket=10;
publicvoidrun(){
for(inti=0;i<20;i++){
if(this.ticket>0){
System.out.println("賣票:ticket"+this.ticket--);
}
}
}
}
packageorg.demo.runnable;
publicclassRunnableTicket{
publicstaticvoidmain(String[]args){
MyThreadmt=newMyThread();
newThread(mt).start();//同一個mt,但是在Thread中就不可以,如果用同一
newThread(mt).start();//個實例化對象mt,就會出現異常
newThread(mt).start();
}
};
雖然現在程序中有三個線程,但是一共賣了10張票,也就是說使用Runnable實現多線程可以達到資源共享目的。
Runnable介面和Thread之間的聯系:

發現Thread類也是Runnable介面的子類。

『貳』 java 多線程 繼承Thread和實現Runnable的區別

Java中線程的創建有兩種方式:

1、 通過繼承Thread類,重寫Thread的run()方法,將線程運行的邏輯放在其中

2、 通過實現Runnable介面,實例化Thread類

Runnable
介面只有一個方法 run(),我們聲明自己的類實現 Runnable
介面並提供這一方法,將我們的線程代碼寫入其中,就完成了這一部分的任務。但是 Runnable 介面並沒有任何對線程的支持,我們還必須創建
Thread 類的實例,這一點通過 Thread 類的構造函數public Thread(Runnable target);來實現。

3、繼承Thread實現的模式是 定義多個線程,各自完成各自的任務.

4、實現Runnable實現的模式是 定義多個線程,實現一個任務.

總結:一個是多個線程分別完成自己的任務,一個是多個線程共同完成一個任務。其實,在實現一個任務用多個線程來做也可以用繼承Thread類來實現,只是比較麻煩,一般我們用實現Runnable介面來實現。

閱讀全文

與threadjavarunnable相關的資料

熱點內容
戰錘40kpdf 瀏覽:375
java判斷字元串是漢字 瀏覽:462
2017初級教材pdf 瀏覽:451
松下空調壓縮機品牌 瀏覽:817
python復選框 瀏覽:746
反詐中心app是什麼時候出來的 瀏覽:586
魔獸世界需要什麼伺服器地址 瀏覽:189
啥是單片機休眠 瀏覽:104
什麼音樂app最好 瀏覽:927
牙膏自製解壓神器 瀏覽:327
卸載linuxwps 瀏覽:226
threadjavarunnable 瀏覽:359
一元線性回歸計演算法 瀏覽:950
刷寶app是什麼鬼 瀏覽:744
linux動態載入模塊 瀏覽:25
javamd5工具類 瀏覽:76
安保嘉獎命令 瀏覽:647
bt種子能壓縮嗎 瀏覽:676
JAVA特點是什麼 瀏覽:886
字幕網app怎麼找 瀏覽:533