国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 學院 > 開發設計 > 正文

thread和runnable的區別

2019-11-08 02:56:32
字體:
來源:轉載
供稿:網友

java多線程

java中有兩種實現多線程的方式: 1. 一種是通過繼承Thread類,同時重寫run()方法。但是java中,只允許單繼承,也就是一個類只能繼承一個父類,使得該方式具有一定的局限性,等下就知道了。 2. 另一種是實現Runnable類接口的run()方法,再結合Thread類來實現多線程。 兩種方式最終都是通過調用start()方法來實現多線程。切記不能直接調用Thread類或Runnable對象的run()方法,因為直接調用run()方法,只會執行同一個線程中的任務,而不會啟動新線程。調用start()方法將會創建一個執行run()方法的線程。下面講幾個例子來輔助理解:

例1:繼承Thread類,調用run()方法

class MThread extends Thread{

    PRivate int ticket = 10;    private String name;    public MThread(String name){        this.name =name;    }        public void run(){        for(int i =0;i<1000;i++){            if(this.ticket>0){                System.out.println(this.name+"賣票---->"+(this.ticket--));            }        }    }

}

public class test33{public static void main(String[] args) {MThread mt1= new MThread("一號窗口");          MThread mt2= new MThread("二號窗口");          MThread mt3= new MThread("三號窗口");          mt1.run();          mt2.run();          mt3.run(); 

}}

結果為:

一號窗口賣票---->10一號窗口賣票---->9一號窗口賣票---->8一號窗口賣票---->7一號窗口賣票---->6一號窗口賣票---->5一號窗口賣票---->4一號窗口賣票---->3一號窗口賣票---->2一號窗口賣票---->1二號窗口賣票---->10二號窗口賣票---->9二號窗口賣票---->8二號窗口賣票---->7二號窗口賣票---->6二號窗口賣票---->5二號窗口賣票---->4二號窗口賣票---->3二號窗口賣票---->2二號窗口賣票---->1三號窗口賣票---->10三號窗口賣票---->9三號窗口賣票---->8三號窗口賣票---->7三號窗口賣票---->6三號窗口賣票---->5三號窗口賣票---->4三號窗口賣票---->3三號窗口賣票---->2

三號窗口賣票---->1

結果分析: 看看運行結果,先執行第一個對象的run(),然后執行第二個對象的run(),并沒有啟動新線程。

例2:繼承Thread類,調用start()方法

class MThread extends Thread{

    private int ticket = 10;    private String name;    public MThread(String name){        this.name =name;    }        public void run(){        for(int i =0;i<1000;i++){            if(this.ticket>0){                System.out.println(this.name+"賣票---->"+(this.ticket--));            }        }    }

}

public class test33{public static void main(String[] args) {MThread mt1= new MThread("一號窗口");          MThread mt2= new MThread("二號窗口");          MThread mt3= new MThread("三號窗口");          mt1.start();          mt2.start();          mt3.start(); 

}}

結果為:

二號窗口賣票---->10二號窗口賣票---->9二號窗口賣票---->8二號窗口賣票---->7一號窗口賣票---->10二號窗口賣票---->6二號窗口賣票---->5二號窗口賣票---->4二號窗口賣票---->3二號窗口賣票---->2二號窗口賣票---->1一號窗口賣票---->9一號窗口賣票---->8一號窗口賣票---->7一號窗口賣票---->6一號窗口賣票---->5一號窗口賣票---->4一號窗口賣票---->3一號窗口賣票---->2一號窗口賣票---->1三號窗口賣票---->10三號窗口賣票---->9三號窗口賣票---->8三號窗口賣票---->7三號窗口賣票---->6三號窗口賣票---->5三號窗口賣票---->4三號窗口賣票---->3三號窗口賣票---->2三號窗口賣票---->1

結果分析: 1. 看看運行結果,兩個線程正常完成交互運行。說明start()方法是新建了一個線程去執行run()方法。 2. 兩個線程訪問的run()方法都是獨立的,對應的MyThread類成員變量ticket也是獨立。資源不能共享。

例3:實現Runnable接口

class MRunable implements Runnable{private String name;private int ticket=10;public void run(){for(int j=0;j<1000;j++){if(this.ticket>0){System.out.println(Thread.currentThread().getName()+"賣票---->"+(this.ticket--));}}}}

public class test33{public static void main(String[] args) {        MRunable mr=new MRunable();        Thread mr1=new Thread(mr,"一號窗口");        Thread mr2=new Thread(mr,"二號窗口");        Thread mr3=new Thread(mr,"三號窗口");        mr1.start();        mr2.start();        mr3.start();}}

結果為:

一號窗口賣票---->10二號窗口賣票---->8二號窗口賣票---->6二號窗口賣票---->5二號窗口賣票---->4一號窗口賣票---->7一號窗口賣票---->2一號窗口賣票---->1二號窗口賣票---->3三號窗口賣票---->9

結果分析: 1. 使用Runnable對象時,Runnable定義的子類沒有start()方法,只有Thread類中才有,觀察Thread類,有一個構造方法public Thread(Runnable target),此構造方法接受Runanble的子類實例,也就是說可以通過Thread類來啟動Runnable實現多線程。 2. 每個線程調用的都是同一個MyRunnable對象的run()方法,訪問的是同一個對象中的變量ticket實例。

Runnable和Thread區別

實際開發中我們通常采用Runnable接口來實現多線程。因為實現Runnable接口比繼承Thread類有如下好處: 1. 避免繼承的局限,一個類可以繼承多個接口,但是類只能繼承一個類。 2. Runnable接口實現的線程便于資源共享。而通過Thread類實現,各自線程的資源是獨立的,不方便共享。

實現Runnable接口比繼承Thread類所具有的優勢:

(1):適合多個相同的程序代碼的線程去處理同一個資源

(2):可以避免java中的單繼承的限制

(3):增加程序的健壯性,代碼可以被多個線程共享,代碼和數據獨立


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 兴义市| 靖州| 洛隆县| 阿鲁科尔沁旗| 汕尾市| 叙永县| 巢湖市| 旺苍县| 基隆市| 金塔县| 盐山县| 舟曲县| 当阳市| 贵溪市| 昌图县| 普定县| 图们市| 绥芬河市| 芜湖县| 曲靖市| 高清| 凌海市| 大悟县| 金塔县| 林周县| 肥乡县| 克拉玛依市| 墨玉县| 温州市| 台南县| 梁山县| 马鞍山市| 图们市| 西畴县| 蛟河市| 郁南县| 新河县| 成安县| 康乐县| 清远市| 泰宁县|