java.util.concurrent和工具類的簡單介紹與分析
一、java.util.concurrent體系的主要大板塊包含內容
說到JUC其實就是說java的多執行緒等和鎖及一些狀態轉換,中斷等,它還涉及到一些tools工具的東東,見下圖:
Tools也包含了5個部分的知識:Executors、Semaphor、Exchanger、CyclicBarrier、CountDownLatch,其實也就是五個工具類
二、Executors
它主要用來建立執行緒池,代理了執行緒池的建立,使得你的建立入口引數變得簡單,通過方法名便知道了你要建立的執行緒池是什麼樣一個執行緒池,功能大概是什麼樣的,其實執行緒池內部都是統一的方法來實現,通過構造方法過載,使得實現不同的功能,但是往往這種方式很多時候不知道具體入口引數的改變有什麼意思,除非讀了原始碼才知道,此時builder模式的方式來完成,builder什麼樣的東西它告訴你就可以。
常見的方法有(都是靜態方法):
1、建立一個指定大小的執行緒池,如果超過大小,放入blocken佇列中,預設是LinkedBlockingQueue,預設的ThreadFactory為:Executors.defaultThreadFactory(),是一個Executors的一個內部類。
Executors.newFixedThreadPool(int)
內部實現如下:
public static ExecutorService newFixedThreadPool(int nThreads) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>()); } |
2、建立一個指定大小的執行緒池,如果超過大小,放入blocken佇列中,預設是LinkedBlockingQueue,自己指定ThreadFactory,自己寫的ThreadFactory,必須implements ThreadFactory,實現方法:newThread(Runnable)。
Executors.newFixedThreadPool(int,ThreadFactory)
內部實現是:
public static ExecutorService newFixedThreadPool(int nThreads, ThreadFactory threadFactory) { return new ThreadPoolExecutor(nThreads, nThreads, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>(), threadFactory); } |
3、建立執行緒池長度為1的,也就是隻有一個長度的執行緒池,多餘的必須等待,它和呼叫Executors.newFixedThreadPool(1)得到的結果一樣:
Executors.newSingleThreadExecutor()
內部實現是:
public static ExecutorService newSingleThreadExecutor() { return new FinalizableDelegatedExecutorService (new ThreadPoolExecutor(1, 1, 0L, TimeUnit.MILLISECONDS, new LinkedBlockingQueue<Runnable>())); } |
4、和方法3類似,可以自定義ThreadFactory,這裡就不多說了!
5、建立可以進行快取的執行緒池,預設快取60s,資料會放在一個SynchronousQueue上,而不會進入blocken佇列中,也就是隻要有執行緒進來就直接進入排程,這個不推薦使用,因為容易出問題,除非用來模擬一些併發的測試:
Executors.newCachedThreadPool();
內部實現為:
public static ExecutorService newCachedThreadPool() { return new ThreadPoolExecutor(0, Integer.MAX_VALUE, 60L, TimeUnit.SECONDS, new SynchronousQueue<Runnable>()); } |
6、和方法5類似,增加自定義ThreadFactory
7、新增一個Schedule的排程器的執行緒池,預設只有一個排程:
Executors.newSingleThreadScheduledExecutor();
內部實現為(這裡可以看到不是用ThreadPoolExector了,schedule換了一個類,內部實現通過ScheduledThreadPoolExecutor類裡面的內部類ScheduledFutureTask來實現的,這個內部類是private,預設引用不到
public static ScheduledExecutorService newSingleThreadScheduledExecutor() { return new DelegatedScheduledExecutorService (new ScheduledThreadPoolExecutor(1)); } |
8、和7一樣,增加自己定義的ThreadFactory
9、新增一個schedule的執行緒池排程器,和newFixedThreadPool有點類似:
Executors.newScheduledThreadPool();
內部程式碼為:
public static ScheduledExecutorService newScheduledThreadPool(int corePoolSize) { return new ScheduledThreadPoolExecutor(corePoolSize); } |
其實內部Exectors裡面還有一些其他的方法,我們就不多說明了,另外通過這裡,大家先可以瞭解一個大概,知道Exectors其實是一個工具類,提供一系列的靜態方法,來完成對對應執行緒池的形象化建立。
每日更新分享java培訓開發技術知識,記得關注我哦!