<em id="0a85b"><option id="0a85b"></option></em>

<abbr id="0a85b"></abbr>

      <nobr id="0a85b"></nobr>
        <tr id="0a85b"></tr>
        9久久伊人精品综合,亚洲一区精品视频在线,成 人免费va视频,国产一区二区三区黄网,99国产精品永久免费视频,亚洲毛片多多影院,精品久久久无码人妻中文字幕,无码国产欧美一区二区三区不卡
        學習啦 > 知識大全 > 知識百科 > 百科知識 > Thread類和Runnable接口實現方式的區別

        Thread類和Runnable接口實現方式的區別

        時間: 映芳735 分享

        Thread類和Runnable接口實現方式的區別

          Thread和Runnable都可以在java中實現多線程,Thread是繼承類,Runnable是接口。下面小編為大家介紹Thread類和Runnable接口區別,感興趣的朋友們一起來看看吧!

          Thread類和Runnable接口實現區別

          1.在程序開發中只要是多線程肯定永遠以實現Runnable接口為主,因為實現Runnable接口相比繼承Thread類有如下好處:

          避免點繼承的局限,一個類可以繼承多個接口。

          適合于資源的共享。

          以賣票程序為例,通過Thread類完成:

          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("賣票:ticket"+this.ticket--);

          }

          }

          }

          };

          下面通過三個線程對象,同時賣票:

          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();//每個線程都各賣了10張,共賣了30張票

          mt2.start();//但實際只有10張票,每個線程都賣自己的票

          mt3.start();//沒有達到資源共享

          }

          }

          如果用Runnable就可以實現資源共享,下面看例子:

          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("賣票:ticket"+this.ticket--);

          }

          }

          }

          }

          package org.demo.runnable;

          public class RunnableTicket {

          public static void main(String[] args) {

          MyThread mt=new MyThread();

          new Thread(mt).start();//同一個mt,但是在Thread中就不可以,如果用同一

          new Thread(mt).start();//個實例化對象mt,就會出現異常

          new Thread(mt).start();

          }

          };

          雖然現在程序中有三個線程,但是一共賣了10張票,也就是說使用Runnable實現多線程可以達到資源共享目的。

          2.public class Thread extends Object implements Runnable

          從上我們可以發現Thread類也是Runnable接口的子類。

          Thread的介紹

          Thread類是在java.lang包中定義的。一個類只要繼承了Thread類同時覆寫了本類中的run()方法就可以實現多線程操作了,但是一個類只能繼承一個父類,這是此方法的局限。

          舉例解析:

          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("線程開始:"+this.name+",i="+i);

          }

          }

          }

          package org.thread.demo;

          public class ThreadDemo01 {

          public static void main(String[] args) {

          MyThread mt1=new MyThread("線程a");

          MyThread mt2=new MyThread("線程b");

          mt1.run();

          mt2.run();

          }

          }

          此時結果很有規律,先第一個對象執行,然后第二個對象執行,并沒有相互運行。

          在JDK的文檔中可以發現,一旦調用start()方法,則會通過JVM找到run()方法。

          下面啟動start()方法啟動線程:

          package org.thread.demo;

          public class ThreadDemo01 {

          public static void main(String[] args) {

          MyThread mt1=new MyThread("線程a");

          MyThread mt2=new MyThread("線程b");

          mt1.start();

          mt2.start();

          }

          };

          這樣程序可以正常完成交互式運行。那么為什么非要使用start();方法啟動多線程呢?

          在JDK的安裝路徑下,src.zip是全部的java源程序,通過此代碼找到Thread中的start()方法的定義,可以發現此方法中使用了 private native void start0();其中native關鍵字表示可以調用操作系統的底層函數,那么這樣的技術成為JNI技術(java Native Interface)。

          Runnable接口的介紹

          在實際開發中一個多線程的操作很少使用Thread類,而是通過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("線程開始:"+this.name+",i="+i);

          }

          }

          };

          但是在使用Runnable定義的子類中沒有start()方法,只有Thread類中才有。此時觀察Thread類,有一個構造方法:public Thread(Runnable targer)。

          此構造方法接受Runnable的子類實例,也就是說可以通過Thread類來啟動Runnable實現的多線程。(start()可以協調系統的資源)。

          舉例解析:

          package org.runnable.demo;

          import org.runnable.demo.MyThread;

          public class ThreadDemo01 {

          public static void main(String[] args) {

          MyThread mt1=new MyThread("線程a");

          MyThread mt2=new MyThread("線程b");

          new Thread(mt1).start();

          new Thread(mt2).start();

          }

          }


        猜你感興趣:

        1.2017java面試題及參考答案

        2.java實習報告范文

        3.java實習報告范文

        4.it實習報告范文

        5.Thread類和Runnable接口實現方式的區別

        6.程序員經典面試題及答案

        537596 主站蜘蛛池模板: 国产欧美日韩精品丝袜高跟鞋| 国产天美传媒性色av高清| 欧洲一区二区中文字幕| 久久亚洲2019中文字幕| 国产91小视频在线观看| 亚洲色精品88色婷婷七月丁香| 中国毛片网| 欧美在线一区二区三区精品| 色视频不卡一区二区三区| 狠狠亚洲色一日本高清色| 一本一道中文字幕无码东京热| 亚洲va无码专区国产乱码| 欧美丰满熟妇乱XXXXX网站| 久久精品免视看成人国产| 2019亚洲午夜无码天堂| 无码毛片一区二区本码视频| 又大又硬又爽免费视频| 人妻暴雨中被强制侵犯在线| 国产深夜福利在线观看网站| 色99久久久久高潮综合影院| 久草热8精品视频在线观看| 免费乱理伦片在线观看| 成人免费视频一区二区| 色综合久久中文综合久久激情| 国产综合视频精品一区二区| 国产真实伦在线观看视频| 国产精品无码久久久久AV| 四虎精品国产AV二区| 国产强奷在线播放免费| 日韩国产成人精品视频| 国产精品黑色丝袜在线观看| 天天夜碰日日摸日日澡性色AV| 国产免费视频| 坐盗市亚洲综合一二三区| 最新国产精品好看的精品| 国产a在视频线精品视频下载| 把女人弄爽大黄A大片片| 狠狠色婷婷久久综合频道日韩 | 成年大片免费视频观看| 亚洲精品国产成人无码区a片| 国产综合视频精品一区二区|