2016-05-30 12 views
1

Ich würde gerne eine CircularFifoQueue mit Feder ExecutorService verwenden.Wie erstelle ich ein CircularFifoQueue-Thread-Safe?

Folgendes wird nicht kompiliert, da CircularFifoQueue nicht vom Typ BlockingQueue ist. Aber es zeigt, was ich versuche zu erreichen:

int threads = 10; 
int queueSize = 500; 
new java.util.concurrent.ThreadPoolExecutor(threads, threads, 0L, TimeUnit.MILLISECONDS, 
       new CircularFifoQueue(queueSize)); 

mit:

package org.apache.commons.collections4.queue; 

public class CircularFifoQueue<E> extends AbstractCollection<E> 
     implements Queue<E>, BoundedCollection<E>, Serializable 

Frage: der Code oben bieten Thread-Sicherheit (als CircularFifoQueue selbst ist nicht thread)? Wenn nicht, wie kann ich es threadsafe machen?

+0

Woher kommt CircularFifoQueue? –

+0

Ist CircularFifoQueue eine blockierende Warteschlange? –

+0

Paketinfo oben hinzugefügt. Es ist * nicht * eine BlockingQueue (die von Entwurf threadsicher wäre). – membersound

Antwort

1

Sie müssen praktisch Ihre eigene Warteschlangenimplementierung schreiben. Da CircularFifoQueue ein zugrunde liegendes Array zum Speichern der Elemente verwendet, würde ich die ArrayBlockingQueue-Datenstruktur im Paket java.util.concurrent als Ausgangspunkt verwenden.

Beispiel:

class ThreadSafeCircularFifoQueue<T> extends CircularFifoQueue<T> implements BlockingQueue<T> { 

    /** Main lock guarding all access */ 
    final ReentrantLock lock; 

    /** Condition for waiting takes */ 
    private final Condition notEmpty; 

    /** Condition for waiting puts */ 
    private final Condition notFull; 

    @Override 
    public int size() { 

     final ReentrantLock lock = this.lock; 
     lock.lock(); 
     try { 
      return super.size(); 
     } finally { 
      lock.unlock(); 
     } 
    } 

    //and so forth 
} 
2

Arbeitswarteschlangen blockiert sein sollen, und damit würden Sie einen decorator zu machen, dass CircularFifoQueue eine BLockingQueue hinzufügen müssen.

class BlockingCircularFifoQueue<E> implements BlockingQueue<E>{ 
    private CircularFifoQueue<E> backingCollection; 
    ... 
} 

Und delegieren Sie bei Bedarf an die Backing-Sammlung. Sie müssten natürlich Conditions und Lock richtig bekommen.

+0

verlängert CircularFifoQueue ein schlechtes Design? – Dexter

+0

@Dexter ja es ist, http://StackOverflow.com/Questions/49002/Prefer-Composition-Over-Erheritance –

+0

Ich denke, "ist eine Beziehung" gilt hier. Wie auch immer, danke für den Link :) – Dexter