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

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

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

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

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

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

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

              在線程系統中進程也是一個線程??梢詫⑦M程理解為一個程序的第一個線程。

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

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

              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 閱讀(268) 評論(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真正的開發應用中用得多嗎?  回復  更多評論
            

          I'm reading...

          Java 60

          Head  First SQL

          寶貝連接


          If you need these books,pls send me emails.
          Email:kunpeng.niu@163.com
          <2009年4月>
          2930311234
          567891011
          12131415161718
          19202122232425
          262728293012
          3456789

          留言簿(10)

          隨筆分類(178)

          隨筆檔案(208)

          文章檔案(1)

          新聞檔案(6)

          相冊

          1.Java Official Website

          2.Java Study Website

          3.Java Technic Website

          4.Java Video Website

          5.Database Website

          6.Bookshop Website

          7.English Website

          8.Friends Link

          9.Other Web

          積分與排名

          • 積分 - 684969
          • 排名 - 67

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 鞍山市| 永川市| 偏关县| 台中市| 江陵县| 富裕县| 吐鲁番市| 张掖市| 吉木乃县| 泗水县| 儋州市| 英德市| 鄂伦春自治旗| 闽清县| 虎林市| 铁岭县| 淮安市| 临潭县| 山丹县| 天全县| 宜阳县| 正阳县| 吉安县| 三江| 项城市| 溧阳市| 抚宁县| 宁明县| 灵宝市| 乌鲁木齐县| 图片| 万载县| 瑞丽市| 无极县| 阳山县| 冷水江市| 静海县| 石城县| 齐河县| 南安市| 睢宁县|