彩虹天堂
          技術源于生活
          posts - 0,  comments - 2,  trackbacks - 0
          昨天我們在BLOG中討論了最常用到的創(chuàng)建線程方法,介紹了他們的用法,優(yōu)點以及他們的不足之處。當然,我們介紹的兩種方法都不是創(chuàng)建線程的最完美方法,方法一無法并發(fā)的處理多個任務,而方法二的話在CPU處理的界限內可以很好的完成任務,但是一旦超出CPU所能承受的壓力,就會導致程序莫名的死掉,所以我們的目標是創(chuàng)建安全的,可使用的,以及高效的線程。
          線程池:線程池是指管理線程的同構池,他可以持有所有等待執(zhí)行的任務,從隊例中獲取下一個任務,執(zhí)行,然后回來繼續(xù)等待另一個線程。和第二種方法比線程池有什么優(yōu)勢呢?
          1.    他重用存在的線程,而不是創(chuàng)建新的線程,這樣做的好處是,在請求到達時,工作線程存在,用于創(chuàng)建線程的等待時間并不會延遲任務的執(zhí)行,響應性提高了。
          2.    通過調整線程池的大小,可以防止過多的線程被創(chuàng)建,不會過多的浪費資源。
          所以,使用線程池是使用線程的最明智選擇,只有當CPU和內存資源使用處理一個穩(wěn)定階段時,我們也才有機會去做調優(yōu),管理,監(jiān)視,記錄日志等其他事情。

          今天我們介紹第三種方法:利用線程池(Thread pool),當然我們這里說的線程池并不需要我們自已去實現或者找第三方的實現。在我們使用JDK1.5開發(fā)時,Sun已經幫我們寫好,我們需要學的就是如何去合理的使用以及調用他們了。也就是java.util.concurrent下面的接口Executor.
          我們先看看API中關于Executor的使用說明:
          ?    執(zhí)行已提交的 Runnable 任務的對象。此接口提供一種將任務提交與每個任務將如何運行的機制(包括線程使用的細節(jié)、調度等)分離開來的方法。通常使用 Executor 而不是顯式地創(chuàng)建線程
          具體如何使用Executor接口呢?下面我們看一個簡單的DEMO:

          public class TestExecute {
              //設定線程池的大小。大小不空
              private static final int NTHREADS=100;
              //定義線程池
              private static final Executor exec=Executors.newFixedThreadPool(NTHREADS);
              public static void main(String[] args)throws IOException{
                  ServerSocket socket=new ServerSocket(80);
                  while(true){
                      final Socket connection=socket.accept();
                      Runnable task=new Runnable(){
                          public void run(){
                              //handlerequest(conntection)
                          }
                      };
                      exec.execute(task);
                  }
              }
          }
          從上面的代碼我們可以看到,在main方法里面其他沒有什么不同,就是最后一步,exec.execute(task),將這個要執(zhí)行的線程放入自已的線程池中,當然然后執(zhí)行的方法就是用的JAVA線程池作者的策略來執(zhí)行了。我們不知道他何時執(zhí)行開始,何時執(zhí)行結束,但是有一點可以確定,線程池可以更好的優(yōu)化程序的速度以及效率。

          不過,使用Executor的類必須實現Runnable接口,然爾大家都知道如果是使實Runnable的類執(zhí)行run() 方法,不能返回值當然也無法拋出已檢查異常。當然,用Executor可以有辦法得到返回值和拋出已檢查異常。

          -----------------------------------
          Q9原創(chuàng)。
          posted on 2008-05-03 00:01 bcterry 閱讀(144) 評論(0)  編輯  收藏

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


          網站導航:
           

          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          留言簿

          文章檔案

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 怀仁县| 霍林郭勒市| 崇义县| 长寿区| 安仁县| 嘉义县| 平原县| 阿勒泰市| 射洪县| 龙里县| 铜川市| 左云县| 肇源县| 林甸县| 潞城市| 孝义市| 江华| 合肥市| 金乡县| 汝州市| 闵行区| 丽江市| 双峰县| 江源县| 南开区| 武胜县| 嫩江县| 育儿| 上犹县| 永登县| 阜宁县| 敦煌市| 大同县| 新兴县| 麦盖提县| 冷水江市| 徐汇区| 苍山县| 琼结县| 石景山区| 当涂县|