2016-04-26 6 views
1
私はExecutorServiceのを作る方法を探しています

により、FIFOの順序はFIFO指定されたキーのすなわちExecutorServiceの:キー

  1. 、オブジェクト(キー)で注文することが、イベントは、彼らが到着した順に処理されます。
  2. 特定のキーでは、一度に1つのイベントしか処理されません。

Netty 3はですが、Nettyに関連付けられています。

グアバはEventBusですが、FIFOを保証するかどうかは不明です。

JKeyLockManagerのようなものを使用してキーをロックすることができますが、FIFOを保証するために、ディスパッチャスレッドで競合する危険性があります。

この問題の一般的な解決方法はありますか?

+0

アクカのアクター( 'ExecutorService'より少し複雑ですが、あなたの要件が組み込まれています)を使用してください。 – Savior

答えて

3

あなたはシンプルにしたい場合は、ワークロードが、これはロックを必要とせずに、忙しいすべてのCPUを維持する非常にアンバランスである場合を除き、私はこの

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); 
} 

のようなFIFOエグゼキュータの数を使用します。

+1

意味があります。 &0x7FFF_FFFFをMath.abs()に使用する理由はありますか? – bcoughlan

+2

@bcoughlanはい、Math.abs(Integer.MIN_VALUE)== Integer.MIN_VALUE、これは40億回のうちの驚き1です。テストによって発見することは困難である。 –

関連する問題