2016-04-26 66 views
1

我正在尋找辦法,使一個ExecutorService由對象(鍵)FIFO排序,即的ExecutorService:FIFO順序由鍵

  1. 對於給定的關鍵,活動將在他們到達的順序進行處理。
  2. 對於給定的鍵,一次只能處理一個事件。

Netty 3有但它與Netty綁定。

番石榴有EventBus,但目前還不清楚它是否保證FIFO。

我可以使用類似的東西來鎖定密鑰,但爲了保證FIFO,我必須冒險在調度程序線程中發生爭用。

有沒有解決這個問題的通用解決方案?

+0

使用Akka actors(比'ExecutorService'複雜一點,但是你的需求是內置的)。 – Savior

回答

3

如果你想簡單起見,我會使用一些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忙,而不需要鎖定。

+1

有道理。是否有理由在Math.abs()上使用&0x7FFF_FFFF? – bcoughlan

+2

@bcoughlan是的,Math.abs(Integer.MIN_VALUE)== Integer.MIN_VALUE,這將在40億次中突然出現1次。即很難通過測試發現。 –