Java學(xué)習(xí)

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

           

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

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

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

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

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

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

                             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("請輸入內(nèi)容(quit代表退出程序)");

                                               //讀取控制臺輸入

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

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

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

          abc

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

          開始發(fā)送

          123

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

          開始發(fā)送

          tbc

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

          開始發(fā)送

          faga

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

          開始發(fā)送

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

          hfsd

          請輸入內(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

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

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

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

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

          當然,這兩個簡單的例子只能夠使你熟悉基本的多線程編程的使用,還沒有進入到多線程編程的核心。

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

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


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


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

          導(dǎo)航

          統(tǒng)計

          公告

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

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 裕民县| 平远县| 伊川县| 甘谷县| 游戏| 库车县| 甘德县| 南昌县| 鄱阳县| 平潭县| 古田县| 环江| 墨竹工卡县| 马龙县| 永宁县| 台湾省| 屏东市| 康保县| 田林县| 马龙县| 皮山县| 桦川县| 松阳县| 沭阳县| 从化市| 新昌县| 樟树市| 句容市| 扎赉特旗| 舒城县| 碌曲县| 绍兴县| 永德县| 双辽市| 喜德县| 霞浦县| 阳朔县| 和林格尔县| 寻乌县| 西乌珠穆沁旗| 方山县|