java 線程池

來源:互聯網
上載者:User

 ExecutorService線程池 ExecutorService 建立多線程的步驟: 

 

ExecutorService線程池 ExecutorService 建立多線程的步驟: 

1。定義線程類 
class Handler implements Runnable{ 
} 

2。建立ExecutorService線程池 
ExecutorService executorService = Executors.newCachedThreadPool(); 

或者 

int cpuNums = Runtime.getRuntime().availableProcessors(); 
                //擷取當前系統的CPU 數目 
ExecutorService executorService =Executors.newFixedThreadPool(cpuNums * POOL_SIZE); 
                //ExecutorService通常根據系統資源情況靈活定義線程池大小 

3。調用線程池操作 
迴圈操作,成為daemon,把新執行個體放入Executor池中 
      while(true){ 
        executorService.execute(new Handler(socket)); 
           // class Handler implements Runnable{ 
        或者 
        executorService.execute(createTask(i)); 
            //private static Runnable createTask(final int taskID) 
      } 

execute(Runnable對象)方法 
其實就是對Runnable對象調用start()方法 
(當然還有一些其他後台動作,比如隊列,優先順序,IDLE timeout,active啟用等) 

幾種不同的ExecutorService線程池對象 
1.newCachedThreadPool() 
-緩衝型池子,先查看池中有沒有以前建立的線程,如果有,就reuse.如果沒有,就建一個新的線程加入池中 
-緩衝型池子通常用於執行一些生存期很短的非同步型任務 
因此在一些連線導向的daemon型SERVER中用得不多。 
-能reuse的線程,必須是timeout IDLE內的池中線程,預設timeout是60s,超過這個IDLE時間長度,線程執行個體將被終止及移出池。 
  注意,放入CachedThreadPool的線程不必擔心其結束,超過TIMEOUT不活動,其會自動被終止。 

2. newFixedThreadPool 
-newFixedThreadPool與cacheThreadPool差不多,也是能reuse就用,但不能隨時建新的線程 
-其獨特之處:任意時間點,最多隻能有固定數目的活動線程存在,此時如果有新的線程要建立,只能放在另外的隊列中等待,直到當前的線程中某個線程終止直接被移出池子 
- 和cacheThreadPool不同,FixedThreadPool沒有IDLE機制(可能也有,但既然文檔沒提,肯定非常長,類似依賴上層的TCP 或UDP IDLE機制之類的),所以FixedThreadPool多數針對一些很穩定很固定的正規並發線程,多用於伺服器 
-從方法的原始碼看,cache池和fixed 池調用的是同一個底層池,只不過參數不同: 
fixed池線程數固定,並且是0秒IDLE(無IDLE) 
cache池線程數支援0-Integer.MAX_VALUE(顯然完全沒考慮主機的資源承受能力),60秒IDLE  

3.ScheduledThreadPool 
-調度型線程池 
-這個池子裡的線程可以按schedule依次delay執行,或周期執行 

4.SingleThreadExecutor 
-單例線程,任意時間池中只能有一個線程 
-用的是和cache池和fixed池相同的底層池,但線程數目是1-1,0秒IDLE(無IDLE) 

上面四種線程池,都使用Executor的預設線程工廠建立線程,也可單獨定義自己的線程工廠 
下面是預設線程工廠代碼: 
    

static class DefaultThreadFactory implements ThreadFactory {         static final AtomicInteger poolNumber = new AtomicInteger(1);         final ThreadGroup group;         final AtomicInteger threadNumber = new AtomicInteger(1);         final String namePrefix;          DefaultThreadFactory() {             SecurityManager s = System.getSecurityManager();             group = (s != null)? s.getThreadGroup() :Thread.currentThread().getThreadGroup();                       namePrefix = "pool-" + poolNumber.getAndIncrement() + "-thread-";         }          public Thread newThread(Runnable r) {     

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.