<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java線程池分析

    SyndContentImpl.value=

        在Java 5.0之前啟動一個任務是通過調用Thread類的start()方法來實現的,任務的提于交和執行是同時進行的,如果你想對任務的執行進行調度或是控制 同時執行的線程數量就需要額外編寫代碼來完成。5.0里提供了一個新的任務執行架構使你可以輕松地調度和控制任務的執行,并且可以建立一個類似數據庫連接 池的線程池來執行任務。這個架構主要有三個接口和其相應的具體類組成。這三個接口是Executor, ExecutorService、ScheduledExecutorService,讓我們先用一個圖來顯示它們的關系:

       

     


    圖的左側是接口,圖的右側是這些接口的具體類。注意Executor是沒有直接具體實現的。

     

    Executor接口:是用來執行Runnable任務的,它只定義一個方法:

     

    • execute(Runnable command):執行Ruannable類型的任務

     

    ExecutorService接口:ExecutorService繼承了Executor的方法,并提供了執行Callable任務和中止任務執行的服務,其定義的方法主要有:

     

    • submit(task):可用來提交Callable或Runnable任務,并返回代表此任務的Future對象
    • invokeAll(collection of tasks):批處理任務集合,并返回一個代表這些任務的Future對象集合
    • shutdown():在完成已提交的任務后關閉服務,不再接受新任務
    • shutdownNow():停止所有正在執行的任務并關閉服務。
    • isTerminated():測試是否所有任務都執行完畢了。
    • isShutdown():測試是否該ExecutorService已被關閉

     

    ScheduledExecutorService接口在ExecutorService的基礎上,ScheduledExecutorService提供了按時間安排執行任務的功能,它提供的方法主要有:

     

    • schedule(task, initDelay): 安排所提交的Callable或Runnable任務在initDelay指定的時間后執行。
    • scheduleAtFixedRate():安排所提交的Runnable任務按指定的間隔重復執行
    • scheduleWithFixedDelay():安排所提交的Runnable任務在每次執行完后,等待delay所指定的時間后重復執行。

     

     

     

    重要的Executors

     

    雖然以上提到的接口有其實現的具體類,但為了方便Java 5.0建議使用Executors的工具類來得到Executor接口的具體對象,需要注意的是Executors是一個類,不是Executor的復數 形式。Executors提供了以下一些static的方法:

     

    • callable(Runnable task): 將Runnable的任務轉化成Callable的任務
    • newSingleThreadExecutor: 產生一個ExecutorService對象,這個對象只有一個線程可用來執行任務,若任務多于一個,任務將按先后順序執行。
    • newCachedThreadPool(): 產生一個ExecutorService對象,這個對象帶有一個線程池,線程池的大小會根據需要調整,線程執行完任務后返回線程池,供執行下一次任務使用。
    • newFixedThreadPool(int poolSize):產生一個ExecutorService對象,這個對象帶有一個大小為poolSize的線程池,若任務數量大于poolSize,任務會被放在一個queue里順序執行。
    • newSingleThreadScheduledExecutor:產生一個ScheduledExecutorService對象,這個對象的線程池大小為1,若任務多于一個,任務將按先后順序執行。
    • newScheduledThreadPool(int poolSize): 產生一個ScheduledExecutorService對象,這個對象的線程池大小為poolSize,若任務數量大于poolSize,任務會在一個queue里等待執行

     

     

     

    舉例說明:

     

    應用Executors來建立Thread pool

     

     

     

    有時候您需要建立一堆Thread來執行一些小任務,然而頻繁的建立Thread有時會是個開銷,因為Thread的建立必須與作業系統互動,如果能建立一個Thread pool來管理這些小的Thread并加以重復使用,對于系統效能會是個改善的方式。

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

     

    方法 說明
    newCachedThreadPool 建立可以快取的Thread,每個Thread預設可idle 60秒

    newFixedThreadPool

    包括固定數量的Thread

    newSingleThreadExecutor

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

     

    舉個簡單的實例,下面的程式使用newFixedThreadPool方法建立Thread pool,當中包括五個可以重復使用的Thread,您可以指定Runnable物件給它,程式中會產生十個Runnable物件,由于Thread pool中只有五個可用的Thread,所以后來建立的五個Runnable必須等待有空閑的Thread才會被執行:

     

    • 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(); // 最后記得關閉Thread pool
    
     }
    }

     

    submit()方法也接受實作Callable介面的物件,最后傳回Future物件,可以取得Callable執行過后的傳回結果。
    
    如果想利用Executors進行排程,例如排定某個工作30秒后執行:

     

     ScheduledExecutorService scheduler = Executors.newSingleThreadScheduledExecutor( );          scheduler.schedule(new Runnable( ) {                                 public void run() {                                     // 排程工作                                 }                             },                             30, TimeUnit.SECONDS);

     

    或排定某個工作5秒后執行,之后每30秒執行一次:

     

     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);如上所示,想要取消排程任務,可以呼叫ScheduledFuture的cancel()方法。

     



    posted on 2012-02-17 18:51 脈凌網絡 閱讀(2257) 評論(0)  編輯  收藏

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


    網站導航:
     
    主站蜘蛛池模板: 小说专区亚洲春色校园| 亚洲最大的黄色网| 久久99久久成人免费播放| 国产不卡免费视频| 国产精品久久亚洲一区二区| 日韩a在线观看免费观看| 久久久亚洲精华液精华液精华液| 免费大片黄在线观看yw| 亚洲乱码无人区卡1卡2卡3| 成人免费无码大片A毛片抽搐| 2020久久精品亚洲热综合一本| 在线视频免费观看高清| 亚洲av无码一区二区三区天堂| 国产人妖ts在线观看免费视频| 国产在亚洲线视频观看| 红杏亚洲影院一区二区三区| 天堂在线免费观看| 亚洲黄色网址在线观看| 免费成人福利视频| 亚洲精品无码久久| 亚洲第一区在线观看| 久久久受www免费人成| 亚洲视频在线观看| 7723日本高清完整版免费| 亚洲久热无码av中文字幕| 天堂亚洲免费视频| 全黄大全大色全免费大片| 亚洲最新黄色网址| 国产日产成人免费视频在线观看| 色www免费视频| 亚洲AV无码专区电影在线观看| 曰曰鲁夜夜免费播放视频 | 日韩免费在线观看| 91av免费在线视频| 在线免费观看亚洲| 日本高清色本免费现在观看| 三年在线观看免费观看完整版中文| 亚洲好看的理论片电影| 国产精品va无码免费麻豆| 两性色午夜视频免费网| 亚洲最大中文字幕无码网站|