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

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

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

    隨筆-199  評論-203  文章-11  trackbacks-0
     1.進程和線程的區別

        通俗一點說,進程就是程序的一次執行,而線程可以理解為進程中的執行的一段程序片段。

        用一點文詞說就是,每個進程都有獨立的代碼和數據空間(進程上下文);而線程可以看成是輕量級的進程。一般來講(不使用特殊技術),同一進程所產生的線程共享同一塊內存空間。

        同一進程中的兩段代碼是不可能同時執行的,除非引入線程。

        線程是屬于進程的,當進程退出時該進程所產生的線程都會被強制退出并清除。

        線程占用的資源要少于進程所占用的資源。

        進程和線程都可以有優先級。

        在線程系統中進程也是一個線程。可以將進程理解為一個程序的第一個線程。

        多進程——在操作系統中,能同時運行多個任務(程序)。

        多線程——在同一應用程序中,有多個順序流同時執行。

        2.通過鐵路售票程序來理解實現多線程的兩種方法:通過java.lang.Thread類和通過Runnable接口

        java中有兩種實現多線程的方式。一是直接繼承Thread類,二是實現Runnable接口。那么這兩種實現多線程的方式在應用上有什么區別呢?

        為了回答這個問題,我們可以通過編寫一段代碼來進行分析。我們用代碼來模擬鐵路售票系統,實現通過四個售票點發售某日某次列車的100張車票,一個售票點用一個線程表示。

        我們首先這樣編寫這個程序:

    public class ThreadDome1{
      public static void main(String[] args){
        ThreadTest t = new ThreadTest();
        t.start();
        t.start();
        t.start();
        t.start();
      }
    }

    class ThreadTest extends Thread{
      private int ticket = 100;
      public void run(){
        while(true){
          if(ticket > 0){
            System.out.println(Thread.currentThread().getName() +
              "is saling ticket" + ticket--);
          }else{
            break;
          }
        }
      }
    }

        上面的代碼中,我們用ThreadTest類模擬售票處的售票過程,run方法中的每一次循環都將總票數減1,模擬賣出一張車票,同時該車票號打印出來,直接剩余的票數到零為止。在ThreadDemo1類的main方法中,我們創建了一個線程對象,并重復啟動四次,希望通過這種方式產生四個線程。從運行的結果來看我們發現其實只有一個線程在運行,這個結果告訴我們:一個線程對象只能啟動一個線程,無論你調用多少遍start()方法,結果只有一個線程。

        我們接著修改ThreadDemo1,在main方法中創建四個Thread對象:

    public class ThreadDemo1{
      public static void main(String[] args){
        new ThreadTest().start();
        new ThreadTest().start();
        new ThreadTest().start();
        new ThreadTest().start();
      }
    }

    class ThreadTest extends Thread{
      private int ticket = 100;
      public void run(){
        while(true){
          if(ticket > 0){
            System.out.println(Thread.currentThread().getName() +
               " is saling ticket" + ticket--);
          }else{
            break;
          }
        }
      }
    }


     這下達到目的了嗎?

        從結果上看每個票號都被打印了四次,即四個線程各自賣各自的100張票,而不去賣共同的100張票。這種情況是怎么造成的呢?我們需要的是,多個線程去處理同一個資源,一個資源只能對應一個對象,在上面的程序中,我們創建了四個ThreadTest對象,就等于創建了四個資源,每個資源都有100張票,每個線程都在獨自處理各自的資源。

        經過這些實驗和分析,可以總結出,要實現這個鐵路售票程序,我們只能創建一個資源對象,但要創建多個線程去處理同一個資源對象,并且每個線程上所運行的是相同的程序代碼。在回顧一下使用接口編寫多線程的過程。

    public class ThreadDemo1{
      public static void main(String[] args){
        ThreadTest t = new ThreadTest();
        new Thread(t).start();
        new Thread(t).start();
        new Thread(t).start();
        new Thread(t).start();
      }
    }

    class ThreadTest implements Runnable{
      private int tickets = 100;
      public void run(){
        while(true){
          if(tickets > 0){
            System.out.println(Thread.currentThread().getName() +
              " is saling ticket " + tickets--);
          }
        }
      }
    }

        上面的程序中,創建了四個線程,每個線程調用的是同一個ThreadTest對象中的run()方法,訪問的是同一個對象中的變量(tickets)的實例,這個程序滿足了我們的需求。在Windows上可以啟動多個記事本程序一樣,也就是多個進程使用同一個記事本程序代碼。

        可見,實現Runnable接口相對于繼承Thread類來說,有如下顯著的好處:

        (1)適合多個相同程序代碼的線程去處理同一資源的情況,把虛擬CPU(線程)同程序的代碼,數據有效的分離,較好地體現了面向對象的設計思想。

        (2)可以避免由于Java的單繼承特性帶來的局限。我們經常碰到這樣一種情況,即當我們要將已經繼承了某一個類的子類放入多線程中,由于一個類不能同時有兩個父類,所以不能用繼承Thread類的方式,那么,這個類就只能采用實現Runnable接口的方式了。

        (3)有利于程序的健壯性,代碼能夠被多個線程共享,代碼與數據是獨立的。當多個線程的執行代碼來自同一個類的實例時,即稱它們共享相同的代碼。多個線程操作相同的數據,與它們的代碼無關。當共享訪問相同的對象時,即它們共享相同的數據。當線程被構造時,需要的代碼和數據通過一個對象作為構造函數實參傳遞進去,這個對象就是一個實現了Runnable接口的類的實例。

    posted on 2009-04-08 08:30 Werther 閱讀(265) 評論(3)  編輯  收藏 所屬分類: 10.Java

    評論:
    # re: 對Java中的線程感想 2009-04-08 09:19 | 激情聊天室
    很獨到  回復  更多評論
      
    # re: 對Java中的線程感想 2009-04-24 16:41 | 入黨申請書
    有見地  回復  更多評論
      
    # re: 對Java中的線程感想 2009-04-30 18:43 | 特立獨行
    線程技術在java真正的開發應用中用得多嗎?  回復  更多評論
      
    主站蜘蛛池模板: 亚洲国产成人久久综合| 国产午夜无码精品免费看| 亚洲综合精品网站在线观看| 免费毛片a线观看| 亚洲av成人综合网 | 亚洲精品线路一在线观看| 成人黄网站片免费视频| 久久精品国产亚洲AV蜜臀色欲| 亚洲Aⅴ无码一区二区二三区软件| 国产亚洲精品久久久久秋霞| 2021免费日韩视频网| 有色视频在线观看免费高清在线直播| 久久久久亚洲AV无码麻豆| 国产美女无遮挡免费视频网站| 免费国产成人午夜在线观看| 亚洲av片在线观看| 国产成人免费福利网站| 久久青草免费91线频观看不卡| 久久亚洲欧美国产精品| 亚洲影院在线观看| 亚洲精品国精品久久99热| 99在线精品免费视频九九视| 中国videos性高清免费| 亚洲国产精品ⅴa在线观看| 亚洲视频在线播放| 久久久久国产亚洲AV麻豆| 国产精品成人免费视频网站京东| 中文字幕在线视频免费观看| 国产AV无码专区亚洲AV麻豆丫 | 国产亚洲男人的天堂在线观看| 亚洲午夜未满十八勿入| 久久久久亚洲AV无码专区桃色| 两个人的视频高清在线观看免费| 免费人成网站在线观看不卡| 久青草国产免费观看| 亚洲AV无码国产精品永久一区| 亚洲欧洲日产韩国在线| 久久青青草原亚洲AV无码麻豆 | 一级黄色免费网站| 另类专区另类专区亚洲| 亚洲人精品亚洲人成在线|