多線程編程基礎(二)-- 線程池的使用

前言

多線程編程基礎(一)中,講到了線程最基本的使用方法。可是在阿里的開發規範上,這是不值得推薦的。能夠在idea中下一個Alibaba Java Coding Guidelines,來糾正咱們開發時的習慣。 java

插件的使用效果

思考

  1. 如何使用多線程?
  2. 如此使用多線程開發的好處是什麼?

線程池

就上面的第一個問題,咱們引入的是一個線程池的概念。想來以前在享元模式中,咱們就說起過緩衝池的概念,那麼線程池是什麼樣的呢?編程

線程池執行模型

從圖中咱們能夠得到信息有設計模式

  1. 任務隊列:workQueue
  2. 核心線程數:coolPoolSize
  3. 最大線程數:maximumPoolSize
  4. 飽和策略:RejectedExecutionHandler

固然,其實須要的參數還有不少。多線程

// ThreadPoolExecutor的構造函數
ThreadPoolExecutor(int corePoolSize,
                              int maximumPoolSize,
                              long keepAliveTime,
                              TimeUnit unit,
                              BlockingQueue<Runnable> workQueue,
                              ThreadFactory threadFactory,
                              RejectedExecutionHandler handler)
複製代碼

線程池分爲不少種類,最經常使用的是這四種:FixedThreadPool、CachedThreadPool、SingleThreadExecutor、ScheduledThreadPool。併發

FixedThreadPool

public static ExecutorService newFixedThreadPool(int nThreads) {
        return new ThreadPoolExecutor(nThreads, nThreads,
                                      0L, TimeUnit.MILLISECONDS,
                                      new LinkedBlockingQueue<Runnable>());
}
複製代碼

從填入的函數能夠看出最大線程數和核心線程數的數量相同,也就意味着只有核心線程了,多出的任務,將會被放置到LinkedBlockingQueue中。ide

CachedThreadPool

public static ExecutorService newCachedThreadPool() {
        return new ThreadPoolExecutor(0, Integer.MAX_VALUE,
                                      60L, TimeUnit.SECONDS,
                                      new SynchronousQueue<Runnable>());
}
複製代碼

沒有核心線程,最大線程數爲無窮,也就意味着所有都是非核心線程。這樣的線程池更適合去完成大量須要當即處理,可是耗時短的任務。函數

SingleThreadExecutor

public static ExecutorService newSingleThreadExecutor() {
        return new FinalizableDelegatedExecutorService
            (new ThreadPoolExecutor(1, 1,
                                    0L, TimeUnit.MILLISECONDS,
                                    new LinkedBlockingQueue<Runnable>()));
}
複製代碼

核心線程數和最大線程數相同,且都爲1,也就意味着任務是按序工做的。post

ScheduledThreadPool

public static ScheduledExecutorService newScheduledThreadPool( int corePoolSize, ThreadFactory threadFactory) {
        return new ScheduledThreadPoolExecutor(corePoolSize, threadFactory);
}

public ScheduledThreadPoolExecutor(int corePoolSize, ThreadFactory threadFactory) {
        super(corePoolSize, Integer.MAX_VALUE, 0, NANOSECONDS,
              new DelayedWorkQueue(), threadFactory);
}
複製代碼

從函數名就已經說明了,是一種定時任務。其實就個人思考,他能夠用於實現各類各樣功能相似的其餘線程池。由於DelayedWorkQueue隊列中你能夠插入一個馬上須要執行的任務。學習

使用線程池的好處

  • 線程的複用

每次使用線程咱們是否是須要去建立一個Thread,而後start(),而後就等結果,最後的銷燬就等着垃圾回收機制來了。 可是問題是若是有1000個任務呢,你要建立1000個Thread嗎?若是建立了,那回收又要花多久的時間?ui

  • 控制線程的併發數

存在覈心線程和非核心線程,還有任務隊列,那麼就能夠保證資源的爭奪是處於一個儘可能可控的狀態的。

  • 線程的管理

以上就是個人學習成果,若是有什麼我沒有思考到的地方或是文章內存在錯誤,歡迎與我分享。


相關文章推薦:

多線程編程基礎(一)-- 線程的使用

JVM必備基礎知識(一) -- 類的加載機制

聊一聊設計模式(一)-- 六大原則

相關文章
相關標籤/搜索