Class RingBuffer<E>
java.lang.Object
de.bsvrz.sys.funclib.losb.ringbuffer.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öckeprotected int
firstElem
Zeiger auf Beginn und Ende des Ringpuffersprotected boolean
isEmpty
protected int
lastElem
Zeiger auf Beginn und Ende des Ringpuffersprotected int
maxSize
Maximale Größe der Warteschlangestatic int
MIN_CHUNK_SIZE
Minimale Blockgroesseprotected int
noOfChunks
Anzahl der Blöckestatic int
UNBOUNDED_SIZE
Minimale Blockgroesse -
Constructor Summary
Constructors Constructor Description RingBuffer(int chnkSize, int mxSize)
-
Method Summary
Modifier and Type Method Description protected void
adjustSizePostDecr()
protected void
adjustSizePreIncr()
void
changeMaxSize(int delta)
Aendert doe Maximale Groesse um den angegebenen Wertprotected 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 odernull
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 Details
-
MIN_CHUNK_SIZE
public static final int MIN_CHUNK_SIZEMinimale Blockgroesse- See Also:
- Constant Field Values
-
UNBOUNDED_SIZE
public static final int UNBOUNDED_SIZEMinimale Blockgroesse- See Also:
- Constant Field Values
-
firstElem
protected int firstElemZeiger auf Beginn und Ende des Ringpuffers -
lastElem
protected int lastElemZeiger auf Beginn und Ende des Ringpuffers -
noOfChunks
protected int noOfChunksAnzahl der Blöcke -
chunkSize
protected int chunkSizeGröße der Blöcke -
maxSize
protected int maxSizeMaximale Größe der Warteschlange -
buf
protected java.lang.Object[] buf -
isEmpty
protected boolean isEmpty
-
-
Constructor Details
-
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 ist16
.mxSize
- Maximale Groesse der Warteschlange. Wird diese ueberschritten, liefertpush(Object)
false. Wenn dieser ParameterUNBOUNDED_SIZE
ist, ist die Groesse unbegrenzt.
-
-
Method Details
-
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
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
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
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
Liefert das erste Element der Warteschlange odernull
wenn keins vorhanden ist.- Returns:
- Das erste Element der Warteschlange oder
null
-
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
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
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
Liefert den zweitobersten Datensatz zurück.- Returns:
- Zeitobersten Datensatz.
null
falls weniger als zwei Datensätze im Ringpuffer sind.
-