1. 程式人生 > 其它 >java.util.concurrent和工具類的簡單介紹與分析

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培訓開發技術知識,記得關注我哦!