<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 20  文章 - 57  trackbacks - 0
    <2010年11月>
    31123456
    78910111213
    14151617181920
    21222324252627
    2829301234
    567891011

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    51CTO

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜


            Java線程類有兩種實(shí)現(xiàn)方式,第一種就是繼承Thread類,另一種是現(xiàn)實(shí)Runnable接口。這兩種實(shí)現(xiàn)方式的區(qū)別很大,下面就說一下它們之間到底有什么區(qū)別。

    我們首先用第一種方式寫一個(gè)線程類:
    代碼如下:


    package Ticket;


    public class Extends {
     
     public static void main(String[] args){
              //實(shí)例化進(jìn)程并準(zhǔn)備執(zhí)行
              new Thread(new MyThread(),"001窗口").start();
              new Thread(new MyThread(),"001窗口").start();
              new Thread(new MyThread(),"001窗口").start();
     
             }

    }

    class MyThread extends Thread{
             //定義一個(gè)變量
              private int ticket = 10;
     
              public void run(){
         
              //這里之所以要循環(huán)300次,就是為了讓所有的 車票都賣出去!可能你會(huì)想,為什么不是30呢?
              //嘿嘿。。。聰明的你肯定明白這個(gè)循環(huán)的次數(shù)為什么會(huì)多出票數(shù)很多?=====其實(shí)我開始也不知道!!!  ==||| 
            
              for(int i=0;i<300;i++){
                   try {
                        //調(diào)用sell()方法
                        this.sell();
                        Thread.sleep(10);
                     } catch (InterruptedException e) {
                                e.printStackTrace();
                     }
      }
     
     }
               public void sell(){
                      if(ticket>0){
                               System.out.println(Thread.currentThread().getName() + " ===> 還剩下" + (ticket--) + "車票");
                      }
     }
    }



    看看這個(gè)程序的運(yùn)行結(jié)果你就明白為什么繼承Thread類實(shí)現(xiàn)線程類的一個(gè)弊端 




    ------------------------------------------------
    大家都發(fā)現(xiàn)了吧!輸出的結(jié)果和預(yù)想的不一樣!!!

    我們來分析一下代碼,查看main函數(shù):
              new Thread(new MyThread(),"001窗口").start();
              new Thread(new MyThread(),"001窗口").start();
              new Thread(new MyThread(),"001窗口").start();

    我們可以看出,實(shí)例化了三個(gè)MyThread類,這樣的話,private int ticket = 10;就運(yùn)行了三次,所以ticket打印出來的 也就是30張;在這里注意一下并不是ticket賦值為30,而是ticket賦值為10,但賦值了三次!!!也就是現(xiàn)在有三個(gè)ticket!!!
    這樣并不能實(shí)現(xiàn)資源共享!
    我們知道我們利用多線程就是為了將多個(gè)線程去處理一個(gè)數(shù)據(jù)的集合!!! 他們是同時(shí)處理的!!!如果向上面的話,并沒有將數(shù)據(jù)的集合(ticket)進(jìn)行共享,而是將每一個(gè)類都從新建了一個(gè)數(shù)據(jù)的集合,分別對自己的集合進(jìn)行處理!!!!
    如果想解決這個(gè)問題,其實(shí)也很簡單,不過如果當(dāng)數(shù)據(jù)的類型和種類比較多的時(shí)候,這樣寫就太麻煩了!!!!

    那實(shí)現(xiàn)Runnable接口的線程類可不可以呢!!???

    下面來看一看:

    代碼如下:


    package IO;

    public class Inter {

        public static void main(String[] args){
            //聲明并實(shí)例化一個(gè)MyThread01類
            MyThread01 mt = new MyThread01();
            new Thread(mt,"001窗口").start();
            new Thread(mt,"002窗口").start();
            new Thread(mt,"003窗口").start();

        }
       
    }

    class MyThread01 implements Runnable{
       
        private int ticket = 10;   
        public void run(){   
            for(int i=0;i<200;i++){
                try {
                    this.sell();
                    Thread.sleep(10);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
           
        }
        public void sell(){
            if(ticket>0){
                System.out.println(Thread.currentThread().getName() + " ===> 還剩下" + (ticket--) + "車票");
            }
           
        } 
    }
           

    ---------------------------------------------
    這段程序的運(yùn)行結(jié)果:


    看看這個(gè)結(jié)果是不是和自己想的一樣啊!!!這樣就可以了!!!用這個(gè)方法去創(chuàng)建一個(gè)線程類是不是可以達(dá)到資源共享啊!!!
    其實(shí)啊!我看來,所謂的資源共享也就是將一個(gè)數(shù)據(jù)的集合讓多個(gè)線程去處理!!!
    我們看一下代碼!!!
            MyThread01 mt = new MyThread01();
            new Thread(mt,"001窗口").start();
            new Thread(mt,"002窗口").start();
            new Thread(mt,"003窗口").start();

    我們可以看出這個(gè)過程中,我們只聲明并實(shí)例化了一個(gè)MyThread01類,也就是說在這里過程中,給ticket進(jìn)行了初始化!!!
    但大家要注意的是:真正創(chuàng)建處理數(shù)據(jù)的線程是
            new Thread(mt,"001窗口").start();
            new Thread(mt,"002窗口").start();
            new Thread(mt,"003窗口").start();
    因此,這樣可以將一個(gè)ticket的數(shù)據(jù)集 由三個(gè)線程來處理!!!
    這樣就是所謂的資源共享!!!
    ok???



    =====================================================================


    總結(jié)一下這兩種方式的特點(diǎn):

    1.繼承Thread來創(chuàng)建線程類的方法,在繼承了Thread后,不能再繼承其他類,這樣靈活性就不如實(shí)現(xiàn)Runnable接口來創(chuàng)建線程類的方法了!!!
    2.正如上面所說的使用實(shí)現(xiàn)Runnable接口來創(chuàng)建線程類的方法可以達(dá)到資源共享!!!(在這里說明一下:繼承Thread類來創(chuàng)建線程類的方法也可以實(shí)現(xiàn)資源共享,只不過比較麻煩!!!因此,在創(chuàng)建線程類的時(shí)候,應(yīng)優(yōu)先選擇實(shí)現(xiàn)Runnable接口來創(chuàng)建線程類的方法!!!)







    posted on 2010-11-07 20:30 tovep 閱讀(5970) 評論(8)  編輯  收藏

    FeedBack:
    # re: Java_線程類兩種創(chuàng)建方式的區(qū)別[未登錄] 2010-11-07 22:15 feenn
    ............
    第一種實(shí)現(xiàn)方法中,每一個(gè)thread都傳入了一個(gè)new MyThread(),那是三個(gè)實(shí)例啊,能和runnable的實(shí)現(xiàn)一樣的么,能實(shí)現(xiàn)共享才怪了。。。。  回復(fù)  更多評論
      
    # re: Java_線程類兩種創(chuàng)建方式的區(qū)別 2010-11-07 23:14 Tovep
    @feenn
    其實(shí)實(shí)現(xiàn)有很多方法啊!
    你可以把ticket設(shè)置為static就可以了!!!  回復(fù)  更多評論
      
    # re: Java_線程類兩種創(chuàng)建方式的區(qū)別[未登錄] 2010-11-08 08:45 feenn
    @Tovep
    是可以有很多方法,但是你文中的這種比較方法明顯是有問題的。繼承Thread的方法在實(shí)例化的時(shí)候使用了三個(gè)實(shí)例,而在實(shí)現(xiàn)Runnable的時(shí)候?qū)嵗皇褂昧艘粋€(gè)實(shí)例,因此這兩種實(shí)驗(yàn)是不具備可比性的,因此結(jié)論也無從說起。  回復(fù)  更多評論
      
    # re: Java_線程類兩種創(chuàng)建方式的區(qū)別[未登錄] 2010-11-08 08:54 feenn
    @Tovep
    因此針對于你的文章,結(jié)論1是正確的,但是文章的例子和整個(gè)推導(dǎo)過程并不能體現(xiàn)這個(gè)結(jié)論。
    對于結(jié)論2,個(gè)人不敢茍同,是否方便實(shí)現(xiàn)共享是設(shè)計(jì)的問題,而不是某個(gè)類或接口天生具有的屬性。因此,能方便的實(shí)現(xiàn)資源共享并不是我們在設(shè)計(jì)的時(shí)候優(yōu)先選擇runnable的理由。  回復(fù)  更多評論
      
    # re: Java_線程類兩種創(chuàng)建方式的區(qū)別 2010-11-08 17:27 weyling
    恩,你懂的@feenn
      回復(fù)  更多評論
      
    # re: Java_線程類兩種創(chuàng)建方式的區(qū)別 2010-11-17 09:49 icejoywoo
    你第一個(gè)例子程序中每次運(yùn)行開始都new了一個(gè)線程, 如果和第二個(gè)例子一樣, 只寫一個(gè)new, 然后start三次的話, 結(jié)果是一樣的, 只是線程的執(zhí)行順序是隨機(jī)的  回復(fù)  更多評論
      
    # re: Java_線程類兩種創(chuàng)建方式的區(qū)別[未登錄] 2014-12-23 09:54 dd
    # re: Java_線程類兩種創(chuàng)建方式的區(qū)別 2015-05-22 10:57 www
    用個(gè)靜態(tài)變量就ok了,還要搞得這么麻煩  回復(fù)  更多評論
      

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
    主頁 主站蜘蛛池模板: 在线综合亚洲中文精品| 亚洲高清中文字幕免费| 亚洲an天堂an在线观看| 亚洲一卡2卡三卡4卡有限公司| 一区二区3区免费视频| 色猫咪免费人成网站在线观看| 成年性羞羞视频免费观看无限| 免费一级毛片正在播放| 亚洲6080yy久久无码产自国产| 国产男女性潮高清免费网站| 亚洲aⅴ无码专区在线观看春色| 在线看片无码永久免费aⅴ| 自怕偷自怕亚洲精品| 色老头永久免费网站| 久久亚洲精品无码播放| 亚洲av无码电影网| 黄桃AV无码免费一区二区三区 | 免费看片免费播放| 亚洲精品无码久久久久牙蜜区| 免费无码一区二区三区蜜桃| 亚洲精品~无码抽插| 久久久久久亚洲av无码蜜芽| 国产成人免费a在线资源| 一级毛片试看60分钟免费播放| 亚洲日韩激情无码一区| 羞羞视频免费网站日本| 亚洲啪啪综合AV一区| 97国产免费全部免费观看| 亚洲欧美日韩中文无线码 | 99久久成人国产精品免费| 精品无码国产污污污免费| 男女作爱免费网站| 亚洲AV第一页国产精品| 100000免费啪啪18免进| 精品韩国亚洲av无码不卡区| 精品亚洲一区二区| 免费av欧美国产在钱| 亚洲日韩图片专区第1页| 久久久久国产精品免费免费搜索| 国产精品久久亚洲一区二区| 久久精品亚洲综合一品|