2016-04-26 7 views
1

ich nach Möglichkeiten, bin auf der Suche eine ExecutorService machen FIFO durch einen Gegenstand (Schlüssel) bestellt werden, das heißtExecutorService: FIFO Bestellung von Schlüsseln

  1. für einen bestimmten Schlüssel, werden die Ereignisse in der sie verarbeitet werden, angekommen .
  2. Für einen bestimmten Schlüssel wird jeweils nur ein Ereignis verarbeitet.

Netty 3 hat aber es ist zu Netty gebunden.

Guava hat EventBus, aber es ist unklar, ob es FIFO garantiert.

Ich könnte den Schlüssel mit etwas wie JKeyLockManager sperren, aber um FIFO zu garantieren, würde ich riskieren, Konflikte im Dispatcher-Thread.

Gibt es irgendwelche allgemeinen Lösungen für dieses Problem da draußen?

+0

Verwenden Sie Akka-Aktoren (ein bisschen komplexer als ein 'ExecutorService', aber Ihre Anforderungen sind eingebaut). – Savior

Antwort

3

Wenn Sie Einfachheit wollen, würde ich eine Reihe von FIFO Testamentsvollstrecker wie diese

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

verwenden, wenn die Arbeitsbelastung sehr unausgewogen ist, wird diese damit beschäftigt alle CPUs halten, ohne die Notwendigkeit einer Verriegelung.

+1

Macht Sinn. Gibt es einen Grund, & 0x7FFF_FFFF über Math.abs() zu verwenden? – bcoughlan

+2

@bcoughlan ja, Math.abs (Integer.MIN_VALUE) == Integer.MIN_VALUE, das wäre eine Überraschung in 4 Milliarden mal. d. h. durch Testen schwer zu entdecken. –