国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Java中Runnable和Thread有什么區別

發(fā)布時(shí)間:2021-07-04 20:13 來(lái)源:億速云 閱讀:0 作者:Leah 欄目: 開(kāi)發(fā)技術(shù)

這篇文章給大家介紹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í),將立刻刪除涉嫌侵權內容。

欧美又大粗又爽又黄大片视频| 香蕉久久一区二区不卡无毒影院| 一线产区和二线产区的差距原因| 裸体女人高潮毛片| 久久综合久久久久88| 久久精品国产久精国产思思|