de.bsvrz.sys.funclib.losb.ringbuffer
Class NumberRingBuffer

java.lang.Object
  extended by de.bsvrz.sys.funclib.losb.ringbuffer.NumberRingBuffer

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).

Version:
$Revision: 1.1 $ / $Date: 2008/01/22 16:55:51 $ / ($Author: yvonnes $)
Author:
beck et al. projects GmbH, Alexander Schmidt

Field Summary
protected  int[] 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
NumberRingBuffer(int chnkSize, int mxSize)
           
 
Method Summary
protected  void adjustSizePostDecr()
           
protected  void adjustSizePreIncr()
           
 void changeMaxSize(int delta)
          Aendert die Maximale Groesse um den angegebenen Wert
protected  void copy2NewArray(int newSize)
           
 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()
           
 
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 int[] buf

isEmpty

protected boolean isEmpty
Constructor Detail

NumberRingBuffer

public NumberRingBuffer(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 die Maximale Groesse um den angegebenen Wert

Parameters:
delta - positiv oder negativ

push

public boolean push(int 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 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.

Returns:
Das erste Element der Warteschlange.
Throws:
java.lang.InterruptedException

status

public java.lang.String status()

size

public int size()

isEmpty

public boolean isEmpty()

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.


Copyright © 2005-2008 beck et al. projects GmbH All Rights Reserved.