- 資訊首頁(yè) > 開(kāi)發(fā)技術(shù) >
- Java中Runnable和Thread有什么區別
這篇文章給大家介紹Java中Runnable和Thread有什么區別,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
在java中可有兩種方式實(shí)現多線(xiàn)程,一種是繼承Thread類(lèi),一種是實(shí)現Runnable接口;Thread類(lèi)是在java.lang包中定義的。一個(gè)類(lèi)只要繼承了Thread類(lèi)同時(shí)覆寫(xiě)了本類(lèi)中的run()方法就可以實(shí)現多線(xiàn)程操作了,但是一個(gè)類(lèi)只能繼承一個(gè)父類(lèi),這是此方法的局限。
下面看例子:
package org.thread.demo; class MyThread extends Thread{ private String name; public MyThread(String name) { super(); this.name = name; } public void run(){ for(int i=0;i<10;i++){ System.out.println("線(xiàn)程開(kāi)始:"+this.name+",i="+i); } } } package org.thread.demo; public class ThreadDemo01 { public static void main(String[] args) { MyThread mt1=new MyThread("線(xiàn)程a"); MyThread mt2=new MyThread("線(xiàn)程b"); mt1.run(); mt2.run(); } }
但是,此時(shí)結果很有規律,先***個(gè)對象執行,然后第二個(gè)對象執行,并沒(méi)有相互運行。在JDK的文檔中可以發(fā)現,一旦調用start()方法,則會(huì )通過(guò)JVM找到run()方法。下面啟動(dòng)start()方法啟動(dòng)線(xiàn)程:
package org.thread.demo; public class ThreadDemo01 { public static void main(String[] args) { MyThread mt1=new MyThread("線(xiàn)程a"); MyThread mt2=new MyThread("線(xiàn)程b"); mt1.start(); mt2.start(); } };
這樣程序可以正常完成交互式運行。那么為啥非要使用start();方法啟動(dòng)多線(xiàn)程呢?
在JDK的安裝路徑下,src.zip是全部的java源程序,通過(guò)此代碼找到Thread中的start()方法的定義,可以發(fā)現此方法中使用了private native void start0();其中native關(guān)鍵字表示可以調用操作系統的底層函數,那么這樣的技術(shù)成為JNI技術(shù)(java Native Interface)
Runnable接口
在實(shí)際開(kāi)發(fā)中一個(gè)多線(xiàn)程的操作很少使用Thread類(lèi),而是通過(guò)Runnable接口完成。
public interface Runnable{ public void run(); }
例子:
package org.runnable.demo; class MyThread implements Runnable{ private String name; public MyThread(String name) { this.name = name; }public void run(){ for(int i=0;i<100;i++){ System.out.println("線(xiàn)程開(kāi)始:"+this.name+",i="+i); } } };
但是在使用Runnable定義的子類(lèi)中沒(méi)有start()方法,只有Thread類(lèi)中才有。此時(shí)觀(guān)察Thread類(lèi),有一個(gè)構造方法:public Thread(Runnable targer)此構造方法接受Runnable的子類(lèi)實(shí)例,也就是說(shuō)可以通過(guò)Thread類(lèi)來(lái)啟動(dòng)Runnable實(shí)現的多線(xiàn)程。(start()可以協(xié)調系統的資源):
package org.runnable.demo; import org.runnable.demo.MyThread; public class ThreadDemo01 { public static void main(String[] args) { MyThread mt1=new MyThread("線(xiàn)程a"); MyThread mt2=new MyThread("線(xiàn)程b"); new Thread(mt1).start(); new Thread(mt2).start(); } }
兩種實(shí)現方式的區別和聯(lián)系:
在程序開(kāi)發(fā)中只要是多線(xiàn)程肯定永遠以實(shí)現Runnable接口為主,因為實(shí)現Runnable接口相比繼承Thread類(lèi)有如下好處:
避免點(diǎn)繼承的局限,一個(gè)類(lèi)可以繼承多個(gè)接口。
適合于資源的共享
以賣(mài)票程序為例,通過(guò)Thread類(lèi)完成:
package org.demo.dff; class MyThread extends Thread{ private int ticket=10; public void run(){ for(int i=0;i<20;i++){ if(this.ticket>0){ System.out.println("賣(mài)票:ticket"+this.ticket--); } } } };
下面通過(guò)三個(gè)線(xiàn)程對象,同時(shí)賣(mài)票:
package org.demo.dff; public class ThreadTicket { public static void main(String[] args) { MyThread mt1=new MyThread(); MyThread mt2=new MyThread(); MyThread mt3=new MyThread(); mt1.start();//每個(gè)線(xiàn)程都各賣(mài)了10張,共賣(mài)了30張票 mt2.start();//但實(shí)際只有10張票,每個(gè)線(xiàn)程都賣(mài)自己的票 mt3.start();//沒(méi)有達到資源共享 } }
如果用Runnable就可以實(shí)現資源共享,下面看例子:
package org.demo.runnable; class MyThread implements Runnable{ private int ticket=10; public void run(){ for(int i=0;i<20;i++){ if(this.ticket>0){ System.out.println("賣(mài)票:ticket"+this.ticket--); } } } } package org.demo.runnable; public class RunnableTicket { public static void main(String[] args) { MyThread mt=new MyThread(); new Thread(mt).start();//同一個(gè)mt,但是在Thread中就不可以,如果用同一 new Thread(mt).start();//個(gè)實(shí)例化對象mt,就會(huì )出現異常 new Thread(mt).start(); } };
雖然現在程序中有三個(gè)線(xiàn)程,但是一共賣(mài)了10張票,也就是說(shuō)使用Runnable實(shí)現多線(xiàn)程可以達到資源共享目的。
Runnable接口和Thread之間的聯(lián)系:
public class Thread extends Object implements Runnable
發(fā)現Thread類(lèi)也是Runnable接口的子類(lèi)。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自互聯(lián)網(wǎng)轉載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權請聯(lián)系QQ:712375056 進(jìn)行舉報,并提供相關(guān)證據,一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容。
Copyright ? 2009-2021 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 珠海市特網(wǎng)科技有限公司 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站