Java學(xué)習(xí)

          java,spring,structs,hibernate,jsf,ireport,jfreechart,jasperreport,tomcat,jboss -----本博客已經(jīng)搬家了,新的地址是 http://www.javaly.cn 如果有對(duì)文章有任何疑問或者有任何不懂的地方,歡迎到www.javaly.cn (Java樂園)指出,我會(huì)盡力幫助解決。一起進(jìn)步

           

          多線程使用示例2----模擬網(wǎng)絡(luò)數(shù)據(jù)發(fā)送

          12.3.2 模擬網(wǎng)絡(luò)數(shù)據(jù)發(fā)送

                   在實(shí)際的網(wǎng)絡(luò)程序開發(fā)中,由于網(wǎng)絡(luò)通訊一般都需要消耗時(shí)間,所以網(wǎng)絡(luò)通訊的內(nèi)容一般都啟動(dòng)專門的線程進(jìn)行處理。

                   這樣,在一個(gè)最簡單的網(wǎng)絡(luò)程序程序中,至少就包含了兩個(gè)線程:處理界面繪制和接收用戶輸入的系統(tǒng)線程,以及至少一個(gè)網(wǎng)絡(luò)通訊線程。

                   下面以一個(gè)簡單的模擬程序,實(shí)現(xiàn)模擬網(wǎng)絡(luò)數(shù)據(jù)的發(fā)送功能,關(guān)于更詳細(xì)的網(wǎng)絡(luò)編程中線程的使用,可以參看后續(xù)的網(wǎng)絡(luò)編程章節(jié)。

                   在該示例代碼中,用戶在控制臺(tái)輸入需要發(fā)送的內(nèi)容,程序接收到用戶的輸入以后,啟動(dòng)一個(gè)單獨(dú)的線程進(jìn)行網(wǎng)絡(luò)通訊,然后用戶可以繼續(xù)在控制臺(tái)進(jìn)行輸入。示例代碼如下所示:

                             package example2;

          import java.io.*;

          /**

           * 模擬網(wǎng)絡(luò)數(shù)據(jù)發(fā)送的測試類

           */

          public class TestNet {

                   public static void main(String[] args) {

                             BufferedReader br = null;

                             String input;

                             try{

                                      //初始化輸入流

                                      br = new BufferedReader(

                                                         new InputStreamReader(System.in));

                                      //循環(huán)接收輸入

                                      while(true){

                                               System.out.println("請(qǐng)輸入內(nèi)容(quit代表退出程序)");

                                               //讀取控制臺(tái)輸入

                                               input = br.readLine();

                                               //判斷是否是結(jié)束

                                               if(input.equals("quit")){

                                                         break; //結(jié)束程序

                                               }

                                               //模擬發(fā)送

                                               NetDemoThread ndt = new NetDemoThread(input);

                                      }

                             }catch(Exception e){

                             }finally{

                                      try {

                                               br.close();

                                      } catch (Exception e) {}

                             }

                   }

          }

          package example2;

          /**

           * 通過繼承Thread類的方式模擬網(wǎng)絡(luò)通訊線程

           */

          public class NetDemoThread extends Thread {

                   String data;

                   public NetDemoThread(String data){

                             this.data = data;

                             start();

                   }

                  

                   public void run(){

                             try{

                                      System.out.println("開始發(fā)送");

                                      Thread.sleep(10000); //模擬網(wǎng)絡(luò)發(fā)送的延遲

                                      System.out.println("發(fā)送完成,發(fā)送的內(nèi)容是:" + data);

                             }catch(Exception e){}

                   }

          }

                   在該示例中,TestNet類實(shí)現(xiàn)接收控制臺(tái)輸入,并在接收到用戶輸入以后,啟動(dòng)網(wǎng)絡(luò)通訊線程發(fā)送數(shù)據(jù),當(dāng)用戶在控制臺(tái)輸入quit時(shí),結(jié)束程序。NetDemoThread類實(shí)現(xiàn)模擬網(wǎng)絡(luò)通訊線程,在需要發(fā)送網(wǎng)絡(luò)數(shù)據(jù)時(shí),創(chuàng)建一個(gè)NetDemoThread類型的線程對(duì)象,并將需要發(fā)送的內(nèi)容作為參數(shù)傳入到該對(duì)象的內(nèi)容,在run方法中,輸出線程的狀態(tài),并使用一個(gè)延遲10秒,比實(shí)際的延遲要夸大很多,的代碼模擬發(fā)送時(shí)的線程延遲。由于這里的延遲比較大,所以如果用戶輸入的數(shù)據(jù)速度比較快的話,會(huì)存在多個(gè)網(wǎng)絡(luò)通訊的線程同時(shí)運(yùn)行。

                   下面是程序的運(yùn)行結(jié)果:

                             請(qǐng)輸入內(nèi)容(quit代表退出程序)

          abc

          請(qǐng)輸入內(nèi)容(quit代表退出程序)

          開始發(fā)送

          123

          請(qǐng)輸入內(nèi)容(quit代表退出程序)

          開始發(fā)送

          tbc

          請(qǐng)輸入內(nèi)容(quit代表退出程序)

          開始發(fā)送

          faga

          請(qǐng)輸入內(nèi)容(quit代表退出程序)

          開始發(fā)送

          發(fā)送完成,發(fā)送的內(nèi)容是:abc

          hfsd

          請(qǐng)輸入內(nèi)容(quit代表退出程序)

          開始發(fā)送

          發(fā)送完成,發(fā)送的內(nèi)容是:123

          發(fā)送完成,發(fā)送的內(nèi)容是:tbc

          發(fā)送完成,發(fā)送的內(nèi)容是:faga

          發(fā)送完成,發(fā)送的內(nèi)容是:hfsd

          quit

                   在該次運(yùn)行中,用戶依次輸入了:123、tbc、fagahfsd,當(dāng)用戶輸入完成以后,模擬網(wǎng)絡(luò)通訊的線程就被啟動(dòng),這個(gè)可以從輸出“開始發(fā)送”語句看出,當(dāng)內(nèi)容發(fā)送完成以后線程自然結(jié)束。最后輸入quit指令結(jié)束程序。

                   當(dāng)然,該程序會(huì)在用戶輸入的內(nèi)容不同時(shí)出現(xiàn)很多不同的結(jié)果,這些結(jié)果能夠使你體會(huì)到兩點(diǎn):

          1、 多個(gè)網(wǎng)絡(luò)通訊的線程在同時(shí)工作,互不干擾。

          2、 當(dāng)輸入quit以后,如果還有網(wǎng)絡(luò)通訊的線程沒有結(jié)束,則程序會(huì)等待到網(wǎng)絡(luò)通訊的線程結(jié)束以后才真正結(jié)束。

          當(dāng)然,這兩個(gè)簡單的例子只能夠使你熟悉基本的多線程編程的使用,還沒有進(jìn)入到多線程編程的核心。

          其實(shí),當(dāng)多線程一起運(yùn)行時(shí),除了帶來一系列的優(yōu)勢(shì)以外,還會(huì)帶來一系列的問題。例如現(xiàn)實(shí)社會(huì)中,一個(gè)兒子繼承遺產(chǎn)時(shí)就很簡單,但是當(dāng)有多個(gè)兒子呢?所以,下面來深入線程的概念,理解多線程編程存在的問題以及解決辦法。

          posted on 2009-06-15 13:23 找個(gè)美女做老婆 閱讀(730) 評(píng)論(0)  編輯  收藏


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


          網(wǎng)站導(dǎo)航:
           

          導(dǎo)航

          統(tǒng)計(jì)

          公告

          本blog已經(jīng)搬到新家了, 新家:www.javaly.cn
           http://www.javaly.cn

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 祁东县| 武汉市| 安庆市| 台中县| 锡林浩特市| 阿瓦提县| 贺州市| 阿勒泰市| 内丘县| 江都市| 望江县| 富源县| 仪陇县| 镇雄县| 阜康市| 息烽县| 荣昌县| 龙川县| 康马县| 麻江县| 东明县| 沈丘县| 石狮市| 中宁县| 册亨县| 富锦市| 威宁| 芜湖县| 昭苏县| 菏泽市| 称多县| 临江市| 全州县| 富川| 海盐县| 菏泽市| 江陵县| 醴陵市| 和政县| 鹤岗市| 齐齐哈尔市|