彩虹天堂
          技術(shù)源于生活
          posts - 0,  comments - 2,  trackbacks - 0
          有時候您需要建立一堆Thread來執(zhí)行一些小任務(wù),然而頻繁的建立Thread有時會是個開銷,因?yàn)門hread的建立必須與作業(yè)系統(tǒng)互動,如果能建立一個Thread pool來管理這些小的Thread並加以重複使用,對於系統(tǒng)效能會是個改善的方式。

          您可以使用Executors來建立Thread pool,Executors有幾個static方法,列出如下:

          方法 說明
          newCachedThreadPool 建立可以快取的Thread,每個Thread預(yù)設(shè)可idle 60秒

          newFixedThreadPool

          包括固定數(shù)量的Thread

          newSingleThreadExecutor

          只有一個Thread,循序的執(zhí)行指定給它的每個任務(wù)
          newScheduledThreadPool 可排程的Thread
          newSingleThreadScheduledExecutor 單一可排程的Thread

          舉個簡單的實(shí)例,下面的程式使用newFixedThreadPool方法建立Thread pool,當(dāng)中包括五個可以重複使用的Thread,您可以指定Runnable物件給它,程式中會產(chǎn)生十個Runnable物件,由於Thread pool中只有五個可用的Thread,所以後來建立的五個Runnable必須等待有空閒的Thread才會被執(zhí)行:
          • ExecutorDemo.java
          package onlyfun.caterpillar;

          import java.util.concurrent.ExecutorService;
          import java.util.concurrent.Executors;

          public class ExecutorDemo {
          public static void main(String[] args) {
          ExecutorService service = Executors.newFixedThreadPool(5);

          for(int i = 0; i < 10; i++) {
          final int count = i;
          service.submit(new Runnable() {
          public void run() {
          System.out.println(count);
          try {
          Thread.sleep(2000);
          } catch (InterruptedException e) {
          e.printStackTrace();
          }

          }
          });
          }

          service.shutdown(); // 最後記得關(guān)閉Thread pool
          }
          }

          submit()方法也接受實(shí)作Callable介面的物件,最後傳回Future物件,可以取得Callable執(zhí)行過後的傳回結(jié)果。

          如果想利用Executors進(jìn)行排程,例如排定某個工作30秒後執(zhí)行:
                  ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( );
                  scheduler.schedule(new Runnable( ) {
                                         public void run() {
                                             // 排程工作
                                         }
                                     },
                                     30, TimeUnit.SECONDS);


          或排定某個工作5秒後執(zhí)行,之後每30秒執(zhí)行一次:
                  ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( );
                  final ScheduledFuture future = scheduler.scheduleAtFixedRate(new Runnable( ) {
                                         public void run() {
                                             // 排程工作
                                             System.out.println("t");
                                         }
                                     },
                                     0, 5, TimeUnit.SECONDS);
                 
                  // 排定 60 秒後取消future
                  scheduler.schedule(new Runnable( ) {
                      public void run( ) {
                        future.cancel(false);
                      }
                    }, 60, TimeUnit.SECONDS);



          如上所示,想要取消排程任務(wù),可以呼叫ScheduledFuture的cancel()方法。

          posted on 2008-08-05 09:20 bcterry 閱讀(1551) 評論(0)  編輯  收藏

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


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

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

          留言簿

          文章檔案

          搜索

          •  

          最新評論

          主站蜘蛛池模板: 许昌市| 恩平市| 渭南市| 五原县| 泾川县| 万宁市| 财经| 揭东县| 新河县| 南陵县| 长沙市| 龙陵县| 伊宁市| 武山县| 金寨县| 宝应县| 海门市| 克山县| 白河县| 洛扎县| 双桥区| 彭州市| 穆棱市| 南木林县| 米脂县| 宜春市| 佛教| 永康市| 定结县| 广宗县| 文昌市| 成安县| 靖宇县| 崇州市| 同仁县| 泾川县| 石嘴山市| 敦化市| 肇东市| 宿州市| 静乐县|