<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.進(jìn)程和線程的區(qū)別

        通俗一點(diǎn)說,進(jìn)程就是程序的一次執(zhí)行,而線程可以理解為進(jìn)程中的執(zhí)行的一段程序片段。

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

        同一進(jìn)程中的兩段代碼是不可能同時(shí)執(zhí)行的,除非引入線程。

        線程是屬于進(jìn)程的,當(dāng)進(jìn)程退出時(shí)該進(jìn)程所產(chǎn)生的線程都會被強(qiáng)制退出并清除。

        線程占用的資源要少于進(jìn)程所占用的資源。

        進(jìn)程和線程都可以有優(yōu)先級。

        在線程系統(tǒng)中進(jìn)程也是一個(gè)線程。可以將進(jìn)程理解為一個(gè)程序的第一個(gè)線程。

        多進(jìn)程——在操作系統(tǒng)中,能同時(shí)運(yùn)行多個(gè)任務(wù)(程序)。

        多線程——在同一應(yīng)用程序中,有多個(gè)順序流同時(shí)執(zhí)行。

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

        java中有兩種實(shí)現(xiàn)多線程的方式。一是直接繼承Thread類,二是實(shí)現(xiàn)Runnable接口。那么這兩種實(shí)現(xiàn)多線程的方式在應(yīng)用上有什么區(qū)別呢?

        為了回答這個(gè)問題,我們可以通過編寫一段代碼來進(jìn)行分析。我們用代碼來模擬鐵路售票系統(tǒng),實(shí)現(xiàn)通過四個(gè)售票點(diǎn)發(fā)售某日某次列車的100張車票,一個(gè)售票點(diǎn)用一個(gè)線程表示。

        我們首先這樣編寫這個(gè)程序:

    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方法中的每一次循環(huán)都將總票數(shù)減1,模擬賣出一張車票,同時(shí)該車票號打印出來,直接剩余的票數(shù)到零為止。在ThreadDemo1類的main方法中,我們創(chuàng)建了一個(gè)線程對象,并重復(fù)啟動四次,希望通過這種方式產(chǎn)生四個(gè)線程。從運(yùn)行的結(jié)果來看我們發(fā)現(xiàn)其實(shí)只有一個(gè)線程在運(yùn)行,這個(gè)結(jié)果告訴我們:一個(gè)線程對象只能啟動一個(gè)線程,無論你調(diào)用多少遍start()方法,結(jié)果只有一個(gè)線程。

        我們接著修改ThreadDemo1,在main方法中創(chuàng)建四個(gè)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;
          }
        }
      }
    }


     這下達(dá)到目的了嗎?

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

        經(jīng)過這些實(shí)驗(yàn)和分析,可以總結(jié)出,要實(shí)現(xiàn)這個(gè)鐵路售票程序,我們只能創(chuàng)建一個(gè)資源對象,但要?jiǎng)?chuàng)建多個(gè)線程去處理同一個(gè)資源對象,并且每個(gè)線程上所運(yùn)行的是相同的程序代碼。在回顧一下使用接口編寫多線程的過程。

    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--);
          }
        }
      }
    }

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

        可見,實(shí)現(xiàn)Runnable接口相對于繼承Thread類來說,有如下顯著的好處:

        (1)適合多個(gè)相同程序代碼的線程去處理同一資源的情況,把虛擬CPU(線程)同程序的代碼,數(shù)據(jù)有效的分離,較好地體現(xiàn)了面向?qū)ο蟮脑O(shè)計(jì)思想。

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

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

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

    評論:
    # re: 對Java中的線程感想 2009-04-08 09:19 | 激情聊天室
    很獨(dú)到  回復(fù)  更多評論
      
    # re: 對Java中的線程感想 2009-04-24 16:41 | 入黨申請書
    有見地  回復(fù)  更多評論
      
    # re: 對Java中的線程感想 2009-04-30 18:43 | 特立獨(dú)行
    線程技術(shù)在java真正的開發(fā)應(yīng)用中用得多嗎?  回復(fù)  更多評論
      
    主站蜘蛛池模板: 一区二区三区在线观看免费| 免费看一级一级人妻片| 1000部拍拍拍18勿入免费视频下载 | 无码av免费网站| 亚洲最大黄色网站| 日韩成人免费在线| 成人精品视频99在线观看免费| 亚洲av激情无码专区在线播放| 四虎永久在线观看免费网站网址| 亚洲第一se情网站| 亚洲成在人线av| 成人午夜性A级毛片免费| 亚洲阿v天堂在线2017免费| 久久亚洲精精品中文字幕| 成人黄软件网18免费下载成人黄18免费视频 | 亚洲黄色激情视频| 国产亚洲精aa成人网站| 免费成人激情视频| 一区二区视频在线免费观看| 亚洲国产成人久久精品大牛影视| 亚洲精品乱码久久久久久中文字幕| 国产大片线上免费观看| WWW免费视频在线观看播放| 亚洲an日韩专区在线| 日日噜噜噜噜夜夜爽亚洲精品| 台湾一级毛片永久免费| 免费A级毛片无码A∨免费| 无码人妻精品中文字幕免费| 两个人看的www视频免费完整版| 一级女性全黄久久生活片免费| 亚洲国产综合精品| 亚洲黄色免费在线观看| 五月天婷亚洲天综合网精品偷| 亚洲黄色免费电影| 美女内射无套日韩免费播放 | 成人毛片视频免费网站观看| 国产成在线观看免费视频| 无码高潮少妇毛多水多水免费| 日本精品人妻无码免费大全| 男女作爱在线播放免费网站| 免费看美女午夜大片|