Class RingBuffer<E>

  • Type Parameters:
    E - Typ der Elemente im Ringpuffer.
    Direct Known Subclasses:
    ArchiveRingBuffer

    public class RingBuffer<E>
    extends java.lang.Object
    Der FIFO-Ringpuffer ist über einem Feld von Objektreferenzen angelegt. Die Gesamtkapazität ist festgelegt oder unbegrenzt, wobei das zugrunde liegende Feld stets durch Blöcke fester Größe erweitert oder reduziert wird. Wenn die Gesamtkapazität gleich der Blockgroesse ist, wird das zugrundeliegende Feld nicht veraendert. Die Einfüge- und Ausleseoperationen sind im den Regelfall von konstantem Aufwand und von proportional zur Puffergröße ansteigendem Auf-wand, falls ein neuer Block angefügt oder gelöscht werden muss. Die Einfüge-/Ausleseoperationen des Regelfalles benötigen nur wenige elementare Anweisungen. Es sind keine Speicheroperationen notwendig und es entsteht auch keine Arbeit für den Garbage Collector. Falls die Feldgröße verändert werden muss, kommt der Aufwand für das Kopieren des gesamten Feldes hinzu. Ein Block wird nur dann gelöscht, wenn eine bestimmte Anzahl Blöcke ungenutzt sind. Dadurch werden oszillierende Felder vermieden, wenn der Füllgrad um eine Blockgrenze pendelt. Die Warteschlangen dienen darüber hinaus zur Synchronisation des produzierenden Prozesses (ruft push() auf) und des verarbeitenden Prozesses (ruft pop() auf).
    • Field Summary

      Fields 
      Modifier and Type Field Description
      protected java.lang.Object[] buf  
      protected int chunkSize
      Größe der Blöcke
      protected int firstElem
      Zeiger auf Beginn und Ende des Ringpuffers
      protected boolean isEmpty  
      protected int lastElem
      Zeiger auf Beginn und Ende des Ringpuffers
      protected int maxSize
      Maximale Größe der Warteschlange
      static int MIN_CHUNK_SIZE
      Minimale Blockgroesse
      protected int noOfChunks
      Anzahl der Blöcke
      static int UNBOUNDED_SIZE
      Minimale Blockgroesse
    • Constructor Summary

      Constructors 
      Constructor Description
      RingBuffer​(int chnkSize, int mxSize)  
    • Method Summary

      All Methods Instance Methods Concrete Methods 
      Modifier and Type Method Description
      protected void adjustSizePostDecr()  
      protected void adjustSizePreIncr()  
      void changeMaxSize​(int delta)
      Aendert doe Maximale Groesse um den angegebenen Wert
      protected void copy2NewArray​(int newSize)  
      E getLast()
      Liefert das zuletzt eingefügte Element.
      boolean isEmpty()  
      protected boolean isFirstElemOneAheadOfLastElem()  
      boolean isFull()
      Zeigt ob der Buffer vollständig gefüllt ist.
      int maxSize()  
      E next()
      Liefert den zweitobersten Datensatz zurück.
      protected int oneStepFurther​(int ptr)  
      E peek()
      Liefert das erste Element der Warteschlange ohne es zu entfernen.
      E pop()
      Liefert das erste Element der Warteschlange.
      E pop​(long timeout)
      Liefert das erste Element der Warteschlange.
      E popNoWait()
      Liefert das erste Element der Warteschlange oder null wenn keins vorhanden ist.
      boolean push​(E elem)
      Fügt ein Objekt in die Warteschlange an letzter Stelle ein.
      int size()  
      java.lang.String status()
      Informmationsausgabe.
      E[] toArray​(E[] newBuf)
      Kopiert den Inhalt des Ringpuffers in eine Liste.
      • Methods inherited from class java.lang.Object

        clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
    • Field Detail

      • MIN_CHUNK_SIZE

        public static final int MIN_CHUNK_SIZE
        Minimale Blockgroesse
        See Also:
        Constant Field Values
      • UNBOUNDED_SIZE

        public static final int UNBOUNDED_SIZE
        Minimale Blockgroesse
        See Also:
        Constant Field Values
      • firstElem

        protected int firstElem
        Zeiger auf Beginn und Ende des Ringpuffers
      • lastElem

        protected int lastElem
        Zeiger auf Beginn und Ende des Ringpuffers
      • noOfChunks

        protected int noOfChunks
        Anzahl der Blöcke
      • chunkSize

        protected int chunkSize
        Größe der Blöcke
      • maxSize

        protected int maxSize
        Maximale Größe der Warteschlange
      • buf

        protected java.lang.Object[] buf
      • isEmpty

        protected boolean isEmpty
    • Constructor Detail

      • RingBuffer

        public RingBuffer​(int chnkSize,
                          int mxSize)
        Parameters:
        chnkSize - Größe der Blöcke, um die das Feld der Warteschlange wächst und schrumpft. Die empfohlene Mindestgröße für diesen Parameter ist 16.
        mxSize - Maximale Groesse der Warteschlange. Wird diese ueberschritten, liefert push(Object) false. Wenn dieser Parameter UNBOUNDED_SIZE ist, ist die Groesse unbegrenzt.
    • Method Detail

      • maxSize

        public int maxSize()
        Returns:
        Maximale Groesse der Warteschlange oder UNBOUNDED_SIZE.
      • changeMaxSize

        public void changeMaxSize​(int delta)
        Aendert doe Maximale Groesse um den angegebenen Wert
        Parameters:
        delta - positiv oder negativ
      • push

        public boolean push​(E elem)
        Fügt ein Objekt in die Warteschlange an letzter Stelle ein. Ein Thread, der in pop() wartet, wird fortgesetzt.
        Parameters:
        elem - Einzufügendes Objekt
        Returns:
        Wahr, wenn Platz in der Queue war und das Datum eingefuegt wurde, falsch sonst
      • pop

        public E pop()
              throws java.lang.InterruptedException
        Liefert das erste Element der Warteschlange. Wenn die Warteschlange leer ist, blockiert der aufrufende Thread bis zum nächsten pop()-Aufruf.
        Returns:
        Das erste Element der Warteschlange.
        Throws:
        java.lang.InterruptedException
      • pop

        public E pop​(long timeout)
              throws java.lang.InterruptedException
        Liefert das erste Element der Warteschlange. Wenn die Warteschlange leer ist, blockiert der aufrufende Thread oder bricht nach nach einer Wartezeit ab.
        Parameters:
        timeout - Wartezeit, nach der die Aktion abgebrochen wird.
        Returns:
        Das erste Element der Warteschlange oder null, falls kein Element in der vorgegebenen Zeit engetroffen ist.
        Throws:
        java.lang.InterruptedException
      • popNoWait

        public E popNoWait()
        Liefert das erste Element der Warteschlange oder null wenn keins vorhanden ist.
        Returns:
        Das erste Element der Warteschlange oder null
      • peek

        public E peek()
        Liefert das erste Element der Warteschlange ohne es zu entfernen.
        Returns:
        Liefert das erste Element aus der Warteschlange.null falls der Puffer leer ist.
      • getLast

        public E getLast()
        Liefert das zuletzt eingefügte Element.
        Returns:
        Zuletzt eingefügtes Element oder null falls RingBuffer leer.
      • status

        public java.lang.String status()
        Informmationsausgabe.
        Returns:
        Liefert die Anzahl der Blöcke und die Anzahl der Elemente im Puffer zurück.
      • size

        public int size()
        Returns:
        Anzahl Elemente im Ringpuffer.
      • isEmpty

        public boolean isEmpty()
        Returns:
        true falls sich keine Elemente im Ringpuffer befinden.
      • adjustSizePreIncr

        protected void adjustSizePreIncr()
      • adjustSizePostDecr

        protected void adjustSizePostDecr()
      • copy2NewArray

        protected void copy2NewArray​(int newSize)
      • oneStepFurther

        protected int oneStepFurther​(int ptr)
      • isFirstElemOneAheadOfLastElem

        protected boolean isFirstElemOneAheadOfLastElem()
      • isFull

        public boolean isFull()
        Zeigt ob der Buffer vollständig gefüllt ist.
        Returns:
        true falls der Buffer vollständig gefüllt.false sonst.
      • toArray

        public E[] toArray​(E[] newBuf)
        Kopiert den Inhalt des Ringpuffers in eine Liste. Es werden nur die Referenzen kopiert - d.h. die Liste enthält die gleichen Objekte wie der Ringpuffer.
        Parameters:
        newBuf - Array in den das Ergebnis kopiert werden soll. Ist das Array zu klein, wird ein neues angelegt.
        Returns:
        Liste.
      • next

        public E next()
        Liefert den zweitobersten Datensatz zurück.
        Returns:
        Zeitobersten Datensatz. null falls weniger als zwei Datensätze im Ringpuffer sind.