您現在的位置是:首頁 > 網路遊戲首頁網路遊戲
java當中的併發包
- 2023-01-26
檢視可以更新嗎
鄭$州$課$工¥場
.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。