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

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

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

    隨筆 - 20  文章 - 57  trackbacks - 0
    <2014年12月>
    30123456
    78910111213
    14151617181920
    21222324252627
    28293031123
    45678910

    常用鏈接

    留言簿(2)

    隨筆分類

    隨筆檔案

    文章分類

    文章檔案

    51CTO

    搜索

    •  

    最新評論

    閱讀排行榜

    評論排行榜


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

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


    package Ticket;


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

    }

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



    看看這個程序的運行結果你就明白為什么繼承Thread類實現線程類的一個弊端 




    ------------------------------------------------
    大家都發現了吧!輸出的結果和預想的不一樣?。?!

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

    我們可以看出,實例化了三個MyThread類,這樣的話,private int ticket = 10;就運行了三次,所以ticket打印出來的 也就是30張;在這里注意一下并不是ticket賦值為30,而是ticket賦值為10,但賦值了三次!??!也就是現在有三個ticket?。。?br /> 這樣并不能實現資源共享!
    我們知道我們利用多線程就是為了將多個線程去處理一個數據的集合?。。?他們是同時處理的?。。∪绻蛏厦娴脑?,并沒有將數據的集合(ticket)進行共享,而是將每一個類都從新建了一個數據的集合,分別對自己的集合進行處理?。。。?br /> 如果想解決這個問題,其實也很簡單,不過如果當數據的類型和種類比較多的時候,這樣寫就太麻煩了!?。?!

    那實現Runnable接口的線程類可不可以呢!!???

    下面來看一看:

    代碼如下:


    package IO;

    public class Inter {

        public static void main(String[] args){
            //聲明并實例化一個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--) + "車票");
            }
           
        } 
    }
           

    ---------------------------------------------
    這段程序的運行結果:


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

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



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


    總結一下這兩種方式的特點:

    1.繼承Thread來創建線程類的方法,在繼承了Thread后,不能再繼承其他類,這樣靈活性就不如實現Runnable接口來創建線程類的方法了?。。?br /> 2.正如上面所說的使用實現Runnable接口來創建線程類的方法可以達到資源共享?。。。ㄔ谶@里說明一下:繼承Thread類來創建線程類的方法也可以實現資源共享,只不過比較麻煩?。?!因此,在創建線程類的時候,應優先選擇實現Runnable接口來創建線程類的方法?。。。?br />






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

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

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


    網站導航:
     
    主頁 主站蜘蛛池模板: 女人18毛片水真多免费播放| a毛片全部播放免费视频完整18| 在线免费观看国产| 亚洲国产精品va在线播放| 99久久国产精品免费一区二区 | 18禁超污无遮挡无码免费网站国产 | 5g影院5g天天爽永久免费影院| 亚洲AV无码国产丝袜在线观看 | 免费国产黄线在线观看| 亚洲男人天堂2022| 日本人的色道www免费一区| 理论亚洲区美一区二区三区| 免费激情视频网站| 九九九精品视频免费| 国产亚洲av人片在线观看| 久久久久久影院久久久久免费精品国产小说 | 精品国产sm捆绑最大网免费站| 2020国产精品亚洲综合网| 国产精品无码一区二区三区免费| 亚洲精品色在线网站| 国产AV无码专区亚洲AV手机麻豆| a毛片免费在线观看| 亚洲精品午夜在线观看| 最近免费中文字幕4| 一级做a毛片免费视频| 亚洲国产一区国产亚洲| 免费观看成人毛片a片2008| 边摸边吃奶边做爽免费视频99| 黑人大战亚洲人精品一区| 国产电影午夜成年免费视频| 亚洲国产欧美国产综合一区 | a级毛片在线免费| 亚洲制服在线观看| 国产极品美女高潮抽搐免费网站| 黄床大片免费30分钟国产精品| 亚洲天天在线日亚洲洲精| 四虎影视大全免费入口| 国产一级a毛一级a看免费人娇| 亚洲国产成人无码av在线播放| 四虎国产精品免费久久影院| 无码精品国产一区二区三区免费 |