您現在的位置是:首頁 > 網路遊戲首頁網路遊戲

java當中的併發包

簡介newSingleThreadScheduledExecutor()²執行緒池的使用提交Runnable,任務完成後Future物件返回null見程式碼:ThreadPoolWithRunable提交Callable,該方法返回一個Futu

檢視可以更新嗎

java當中的併發包

鄭$州$課$工¥場

.1.

java

併發包介紹

JDK5。0

以後的版本都引入了高階併發特性,大多數的特性在

java。util。concurrent

包中,是專門用於多執行緒發程式設計的,充分利用了現代多處理器和多核心繫統的功能以編寫大規模併發應用程式。主要包含原子量、併發集合、同步器、可重入鎖,並對執行緒池的構造提供

了強力的支援。

執行緒池

²

執行緒池的

5

中建立方式:

1、

Single Thread Executor :

只有一個執行緒的執行緒池,因此所有提交的任務是順序執行,

程式碼:

Executors。newSingleThreadExecutor()

2、

Cached Thread Pool :

執行緒池裡有很多執行緒需要同時執行,老的可用執行緒將被新的任務觸發重新執行,如果執行緒超過

60

秒內沒執行,那麼將被終止並從池中刪除,

程式碼:

Executors。newCachedThreadPool()

3、

Fixed Thread Pool :

擁有固定執行緒數的執行緒池,如果沒有任務執行,那麼執行緒會一直等待,

程式碼:

Executors。newFixedThreadPool(4)

在建構函式中的引數

4

是執行緒池的大小,你可以隨意設定,也可以和

cpu

的數量保持一致,獲取

cpu

的數量

int cpuNums = Runtime。getRuntime()。availableProcessors();

4、

Scheduled Thread Pool :

用來排程即將執行的任務的執行緒池,

程式碼:

Executors。newScheduledThreadPool()

5、

Single Thread Scheduled Pool :

只有一個執行緒,用來排程執行將來的任務,程式碼:

Executors。newSingleThreadScheduledExecutor()

²

執行緒池的使用

提交

Runnable

,任務完成後

Future

物件返回

null

見程式碼:

ThreadPoolWithRunable

提交

Callable

,該方法返回一個

Future

例項表示任務的狀態

見程式碼:

ThreadPoolWithcallable

.2.

java

併發包訊息佇列及在開源軟體中的應用

BlockingQueue

也是

java。util。concurrent

下的主要用來控制執行緒同步的工具。

主要的方法是:

put

take

一對阻塞存取;

add

poll

一對非阻塞存取。

插入

1)add(anObject):

anObject

加到

BlockingQueue

即如果

BlockingQueue

可以容納

則返回

true,

否則丟擲

2)offer(anObject):

表示如果可能的話

anObject

加到

BlockingQueue

即如果

BlockingQueue

可以容納

則返回

true,

否則返回

false。

3)put(anObject):

anObject

加到

BlockingQueue

如果

BlockQueue

沒有空間

則呼叫此方法的執行緒被阻斷直到

BlockingQueue

裡面有空間再繼續

讀取:

4)poll(time):

取走

BlockingQueue

裡排在首位的物件

若不能立即取出

則可以等

time

引數規定的時間

取不到時返回

null

5)take():

取走

BlockingQueue

裡排在首位的物件

BlockingQueue

為空

阻斷進入等待狀態直到

Blocking

有新的物件被加入為止

其他

int remainingCapacity();

返回佇列剩餘的容量,在佇列插入和獲取的時候,不要瞎搞,數

據可能不準

boolean remove(Object o);

從佇列移除元素,如果存在,即移除一個或者更多,佇列改

變了返回

true

public boolean contains(Object o);

檢視佇列是否存在這個元素,存在返回

true

int drainTo(Collection<? super E> c);

傳入的集合中的元素,如果在佇列中存在,那麼將

佇列中的元素移動到集合中

int drainTo(Collection<? super E> c, int maxElements);

和上面方法的區別在於,制定了移

動的數量

BlockingQueue

有四個具體的實現類

常用的兩種實現類為:

1

ArrayBlockingQueue

:一個由陣列支援的有界阻塞佇列,規定大小的

BlockingQueue,

其建構函式必須帶一個

int

引數來指明其大小

其所含的物件是以

FIFO(

先入先出

順序排序的。

2

LinkedBlockingQueue

:大小不定的

BlockingQueue,

若其建構函式帶一個規定大小的引數

生成的

BlockingQueue

有大小限制

若不帶大小引數

所生成的

BlockingQueue

的大小由

Integer。MAX_VALUE

來決定

其所含的物件是以

FIFO(

先入先出

順序排序的。

LinkedBlockingQueue

可以指定容量,也可以不指定,不指定的話,預設最大是

Integer。MAX_VALUE,

其中主要用到

put

take

方法,

put

方法在佇列滿的時候會阻塞直到有佇列成員被消費,

take

方法在佇列空的時候會阻塞,直到有佇列成員被放進來。

LinkedBlockingQueue

ArrayBlockingQueue

區別:

鄭¥州*課&工@場!

LinkedBlockingQueue

ArrayBlockingQueue

比較起來

它們背後所用的資料結構不一樣

導致

LinkedBlockingQueue

的資料吞吐量要大於

ArrayBlockingQueue,

但線上程數量很大時其效能的可預見性低於

ArrayBlockingQueue。

Top