public class NumberRingBuffer
extends java.lang.Object
Der FIFO-Ringpuffer ist über einem Feld von int 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).
Modifier and Type | Field and Description |
---|---|
protected int[] |
buf |
private int |
chnkDecreases |
private int |
chnkIncreases |
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
|
private static int |
MIN_CHUNK_NO
Anzahl der Blöcke die initial angelegt und nicht unterschritten wird
|
static int |
MIN_CHUNK_SIZE
Minimale Blockgroesse
|
protected int |
noOfChunks
Anzahl der Blöcke
|
private static int |
REM_CHUNK_THRESHOLD
Blöcke werden gelöscht, wenn mindestens diese Zahl an Blöcken ungenutzt ist
|
static int |
UNBOUNDED_SIZE
Minimale Blockgroesse
|
Constructor and Description |
---|
NumberRingBuffer(int chnkSize,
int mxSize) |
Modifier and Type | Method and Description |
---|---|
protected void |
adjustSizePostDecr() |
protected void |
adjustSizePreIncr() |
void |
changeMaxSize(int delta)
Aendert die Maximale Groesse um den angegebenen Wert
|
protected void |
copy2NewArray(int newSize) |
private int |
directPop() |
boolean |
isEmpty() |
protected boolean |
isFirstElemOneAheadOfLastElem() |
boolean |
isFull()
Zeigt ob der Buffer vollständig gefüllt ist.
|
int |
maxSize() |
protected int |
oneStepFurther(int ptr) |
int |
pop()
Liefert das erste Element der Warteschlange.
|
boolean |
push(int elem)
Fügt ein Objekt in die Warteschlange an letzter Stelle ein.
|
int |
size() |
java.lang.String |
status() |
public static final int MIN_CHUNK_SIZE
Minimale Blockgroesse
public static final int UNBOUNDED_SIZE
Minimale Blockgroesse
private static final int MIN_CHUNK_NO
Anzahl der Blöcke die initial angelegt und nicht unterschritten wird
private static final int REM_CHUNK_THRESHOLD
Blöcke werden gelöscht, wenn mindestens diese Zahl an Blöcken ungenutzt ist
protected int firstElem
Zeiger auf Beginn und Ende des Ringpuffers
protected int lastElem
Zeiger auf Beginn und Ende des Ringpuffers
protected int noOfChunks
Anzahl der Blöcke
protected int chunkSize
Größe der Blöcke
protected int maxSize
Maximale Größe der Warteschlange
protected int[] buf
protected boolean isEmpty
private int chnkIncreases
private int chnkDecreases
public NumberRingBuffer(int chnkSize, int mxSize)
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.public int maxSize()
UNBOUNDED_SIZE
.public void changeMaxSize(int delta)
Aendert die Maximale Groesse um den angegebenen Wert
delta
- positiv oder negativpublic boolean push(int elem)
Fügt ein Objekt in die Warteschlange an letzter Stelle ein. Ein Thread, der in pop() wartet, wird fortgesetzt.
elem
- Einzufügendes Objektpublic int 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.
java.lang.InterruptedException
private int directPop()
public java.lang.String status()
public int size()
public boolean isEmpty()
protected void adjustSizePreIncr()
protected void adjustSizePostDecr()
protected void copy2NewArray(int newSize)
protected int oneStepFurther(int ptr)
protected boolean isFirstElemOneAheadOfLastElem()
public boolean isFull()
Zeigt ob der Buffer vollständig gefüllt ist.
true
falls der Buffer vollständig gefüllt.false
sonst.