Java學習

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

           

          多線程使用示例1

          12.3 多線程使用示例

                   多線程技術對于初學者來說,是編程思維的一種跳躍,在實際學習時,一定要熟悉線程的基礎知識,掌握線程的實現方式,然后就是開始大量的進行實踐,從實踐中領悟線程編程的奧妙以及實現的原理。

                   下面通過幾個常見的例子演示多線程的基本使用。

          12.3.1 定時炸彈

                   定時炸彈是在電影中常見的一種裝置,在該部分就使用多線程技術模擬該功能。實現的功能為:在程序啟動以后進行倒計時,當60秒以后程序結束,在程序運行時可以在控制臺輸入quit控制線程(炸彈)的暫停。

                   在該示例程序中,開啟了一個系統線程(main方法所在的線程),該線程的作用是啟動模擬定時炸彈的線程,并且在控制臺接受用戶的輸入,并判斷輸入的內容是否為quit,如果是則結束模擬定時炸彈的線程,程序結束。

                   首先來看一下使用繼承Thread類的方式實現多線程時的代碼示例,代碼如下:

                             package example1;

          import java.io.*;

          /**

           * 模擬定時炸彈線程

           */

          public class TestTimeBomb1 {

                   public static void main(String[] args) {

                             //創建線程和啟動線程

                             TimeBombThread tbt = new TimeBombThread();

                             //接受控制臺輸入

                             BufferedReader br = new BufferedReader(

                                                         new InputStreamReader(System.in));

                             String line;

                             try{

                                      while(true){

                                               System.out.println("輸入quit結束線程:");

                                               //獲得控制臺輸入

                                               line = br.readLine();

                                               //判斷是否是quit

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

                                                         tbt.stopThread(); //結束線程

                                                         break; //結束循環

                                               }

                                      }

                             }catch(Exception e){}

                   }

          }

                             package example1;

          /**

           * 使用繼承Thread類的方式模擬定時炸彈邏輯

           */

          public class TimeBombThread extends Thread {

                   int n;

                   boolean isRun;

                   public TimeBombThread(){

                             n = 60;

                             isRun = true;

                             start();//啟動線程

                   }

                  

                   public void run(){

                             try{

                                      while(isRun){

                                               Thread.sleep(1000); //延遲1

                                               System.out.println("剩余時間:" + n);

                                               if(n <= 0){

                                                         isRun = false; //結束線程

                                                         System.out.println("炸彈爆炸!");

                                                         break;

                                               }

                                               n--; //時間減少1

                                      }

                             }catch(Exception e){}

                   }

                  

                   public void stopThread(){

                             isRun = false;

                   }

          }

                   在該示例代碼中,TestTimeBomb1類中包含的是系統線程,在系統線程中啟動模擬定時炸彈的TimeBombThread線程,然后在TestTimeBomb1中接收用戶的控制臺輸入,如果輸入的內容是quit則結束線程,程序結束,否則忽略用戶的輸入,繼續等待用戶輸入。按照前面介紹的IO知識,在接收控制臺輸入時readLine是阻塞方法,也就是該方法在未獲得用戶輸入時會阻塞系統線程的執行,使系統線程進入到等待狀態,等待用戶輸入。而TimeBombThread實現的邏輯是每隔1秒鐘減少一次數值,并輸出剩余時間,當剩余時間為零時,結束TimeBombThread線程。這樣兩個線程就同時工作了,系統線程等待用戶輸入的同時,模擬定時炸彈的線程繼續執行,這樣程序中就包含了兩個同時執行的流程。

                   在這里需要特別說明的是,如何控制線程的結束?在本程序中,使用的是讓線程自然死亡的方式,在實際控制線程時,當線程的run方法執行結束則線程自然死亡,所以在本程序中通過控制isRun變量使得線程可以自然結束,從而釋放線程占用的資源。

                   同樣的功能也可以使用TimerTimerTask組合的方式實現,實現的代碼如下所示:

                             package example1;

          import java.io.*;

          /**

           * 模擬定時炸彈線程

           */

          public class TestTimeBomb2 {

                   public static void main(String[] args) {

                             //創建線程和啟動線程

                             TimeBombTimerTask tbtt = new TimeBombTimerTask();

                             //接受控制臺輸入

                             BufferedReader br = new BufferedReader(

                                                         new InputStreamReader(System.in));

                             String line;

                             try{

                                      while(true){

                                               System.out.println("輸入quit結束線程:");

                                               //獲得控制臺輸入

                                               line = br.readLine();

                                               //判斷是否是quit

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

                                                         tbtt.stopThread(); //結束線程

                                                         break; //結束循環

                                               }

                                      }

                             }catch(Exception e){}

                   }

          }

          package example1;

          import java.util.*;

          /**

           * 使用TimerTimerTask組合模擬定時炸彈

           */

          public class TimeBombTimerTask extends TimerTask {

                   int n;

                   Timer t;

                   boolean isRun;

                   public TimeBombTimerTask(){

                             n = 60;

                             isRun = true;

                             t = new Timer();

                             t.schedule(this, 0); //啟動線程

                   }

                  

                   public void run() {

                             try{

                                      while(isRun){

                                               Thread.sleep(1000); //延遲1

                                               System.out.println("剩余時間:" + n);

                                               if(n <= 0){

                                                         stopThread(); //結束線程

                                                         System.out.println("炸彈爆炸!");

                                                         break;        //結束循環

                                               }

                                               n--; //時間減少1

                                      }

                             }catch(Exception e){}

                   }

                  

                   public void stopThread(){

                             isRun = false;

                             t.cancel();

                   }

          }

                   在該示例代碼中,實現的原理和前面的類似,TestTimeBomb2類實現系統線程,功能是啟動模擬定時炸彈的線程,并接收用戶的控制臺輸入。而TimeBombTimerTask類實現模擬定時炸彈的線程,在該類內部包含啟動線程的Timer對象,當構造該類的對象時,不僅完成該類的初始化,而且啟動線程。

                   在控制Timer啟動的線程結束時,首先結束當前的TimerTask線程,然后再調用Timer對象的cancel方法結束Timer對象的線程,這樣才可以真正停止這種方式啟動的線程。

                   至于使用實現Runnable方式實現線程的方式,和繼承Thread類的實現幾乎一致,讀者可以根據第一種方式的實現獨自進行實現,這里就不再重復實現了。

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


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


          網站導航:
           

          導航

          統計

          公告

          本blog已經搬到新家了, 新家:www.javaly.cn
           http://www.javaly.cn

          常用鏈接

          留言簿(6)

          隨筆檔案

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 黄浦区| 多伦县| 新竹县| 崇州市| 岳池县| 康定县| 潜江市| 新龙县| 明星| 东山县| 无极县| 临汾市| 毕节市| 镇巴县| 崇仁县| 石河子市| 龙泉市| 阳新县| 中卫市| 星座| 巨鹿县| 香河县| 宜川县| 镇原县| 黄陵县| 亳州市| 巴彦淖尔市| 土默特右旗| 额尔古纳市| 松原市| 滦平县| 类乌齐县| 邻水| 刚察县| 江都市| 辽宁省| 神农架林区| 河北区| 襄樊市| 蓬溪县| 青铜峡市|