我正在尋找辦法,使一個ExecutorService由對象(鍵)FIFO排序,即的ExecutorService:FIFO順序由鍵
- 對於給定的關鍵,活動將在他們到達的順序進行處理。
- 對於給定的鍵,一次只能處理一個事件。
Netty 3有但它與Netty綁定。
番石榴有EventBus,但目前還不清楚它是否保證FIFO。
我可以使用類似的東西來鎖定密鑰,但爲了保證FIFO,我必須冒險在調度程序線程中發生爭用。
有沒有解決這個問題的通用解決方案?
我正在尋找辦法,使一個ExecutorService由對象(鍵)FIFO排序,即的ExecutorService:FIFO順序由鍵
Netty 3有但它與Netty綁定。
番石榴有EventBus,但目前還不清楚它是否保證FIFO。
我可以使用類似的東西來鎖定密鑰,但爲了保證FIFO,我必須冒險在調度程序線程中發生爭用。
有沒有解決這個問題的通用解決方案?
如果你想簡單起見,我會使用一些FIFO執行人這樣
static final int executors = Runtime.getRuntime().availableProcessors() * 2;
ExecutorService[] executors = new ExecutorService[executors];
// fill with single threaded executors.
public Future submit(Object actorId, Runnable r) {
int h = (actorId.hashCode() & 0x7FFF_FFFF) % executors;
return executors[h].submit(r);
}
除非工作量是非常不平衡的,這將保持所有的CPU忙,而不需要鎖定。
有道理。是否有理由在Math.abs()上使用&0x7FFF_FFFF? – bcoughlan
@bcoughlan是的,Math.abs(Integer.MIN_VALUE)== Integer.MIN_VALUE,這將在40億次中突然出現1次。即很難通過測試發現。 –
使用Akka actors(比'ExecutorService'複雜一點,但是你的需求是內置的)。 – Savior