public class TelegramQueue<Telegram extends QueueableTelegram>
extends java.lang.Object
Klasse, die zum gepufferten Austausch von Telegrammen zwischen verschiedenen Threads verwendet werden kann. Die Gesamtgröße der gepufferten Telegramme ist beschränkt. Es werden verschiedene Telegrammprioritäten unterstützt.
Telegramme können mit der Methode put(Telegram)
gespeichert werden und mit der Methode take()
wieder ausgelesen werden. Die Methoden blockieren, wenn beim Speichern nicht genügend Platz vorhanden ist, bzw., wenn beim Auslesen kein Telegramm mehr zur Verfügung steht. Der Methode close()
dient zum Schließen der Queue. blockiert keine der beiden Methoden mehr.
Modifier and Type | Field and Description |
---|---|
private int |
_capacity
Maximale Gesamtgröße für zwischengespeicherte Telegramme.
|
private boolean |
_closed |
private java.util.LinkedList<Telegram>[] |
_priorityLists
Array, das je mögliche Priorität eine verkettete Liste mit den zwischengespeicherten Telegrammen enthält.
|
private int |
_size
Gesamtgröße der aktuell zwischengespeicherten Telegramme.
|
Constructor and Description |
---|
TelegramQueue(int capacity,
int maximumPriority)
Erzeugt eine neue Queue mit den angegebenen Eigenschaften.
|
Modifier and Type | Method and Description |
---|---|
void |
abort()
Diese Methode schließt die Verbindung und löscht alle noch gespeicherten Telegramme.
|
void |
close()
Diese Methode schließt die Verbindung.
|
int |
getCapacity()
Bestimmt die maximale Gesamtgröße für zwischengespeicherte Telegramme.
|
int |
getSize()
Bestimmt die Gesamtgröße der aktuell zwischengespeicherten Telegramme.
|
void |
put(Telegram telegram)
Speichert das angegebene Telegramm in der Queue.
|
Telegram |
take()
Gibt das älteste in der Queue gespeicherte Telegramm mit der höchsten Priorität zurück.
|
int |
takeMultiple(int sizeLimit,
java.util.Collection<Telegram> result)
Gibt die ältesten in der Queue gespeicherten Telegramme zurück, so lange bis die summierte Telegrammlänge das angegebene Limit überschreitet oder die Queue leer ist.
|
private final int _capacity
Maximale Gesamtgröße für zwischengespeicherte Telegramme.
private int _size
Gesamtgröße der aktuell zwischengespeicherten Telegramme.
private final java.util.LinkedList<Telegram extends QueueableTelegram>[] _priorityLists
Array, das je mögliche Priorität eine verkettete Liste mit den zwischengespeicherten Telegrammen enthält. Es dient außerdem der Synchronisation von Threads beim lesenden und schreibenden Zugriff.
private boolean _closed
public TelegramQueue(int capacity, int maximumPriority)
Erzeugt eine neue Queue mit den angegebenen Eigenschaften.
capacity
- Maximale Gesamtgröße der gepufferten Telegramme.maximumPriority
- Maximale von Telegrammen verwendete Priorität.public Telegram take() throws java.lang.InterruptedException
Gibt das älteste in der Queue gespeicherte Telegramm mit der höchsten Priorität zurück. Wenn die Queue noch nicht geschlossen wurde, wartet diese Methode, bis ein Telegramm in der Queue zur Verfügung steht.
null
zurückgegeben.java.lang.InterruptedException
- Wenn der Thread während des Wartens unterbrochen wurde.public int takeMultiple(int sizeLimit, java.util.Collection<Telegram> result) throws java.lang.InterruptedException
Gibt die ältesten in der Queue gespeicherten Telegramme zurück, so lange bis die summierte Telegrammlänge das angegebene Limit überschreitet oder die Queue leer ist. Das erste Telegramm, was dafür sorgt, dass das Limit überschritten wird, wird mit zurückgegeben. Das bedeutet, dass auch bei einem Limit von 0 immer (genau) ein Telegramm zurückgegeben wird.
sizeLimit
- Anzahl Bytes, die diese Methode versucht mindestens zurückzugeben (solange in der Queue genug Daten da sind)result
- Liste in der die Telegramme zurückgegeben werden. Wird übergeben, damit nicht ständig eine neue Liste erstellt werden muss. Die Liste wird beim Aufruf der Methode geleert.java.lang.InterruptedException
public void put(Telegram telegram) throws java.lang.InterruptedException
Speichert das angegebene Telegramm in der Queue. Bei Bedarf wartet diese Methode bis genügend Platz in der Queue für das zu speichernde Telegramm zur Verfügung steht.
telegram
- Das zu speichernde Telegrammjava.lang.InterruptedException
- Wenn der Thread während des Wartens unterbrochen wurde.public int getCapacity()
Bestimmt die maximale Gesamtgröße für zwischengespeicherte Telegramme.
public int getSize()
Bestimmt die Gesamtgröße der aktuell zwischengespeicherten Telegramme.
public void close()
Diese Methode schließt die Verbindung. Danach ignoriert die Methode put(Telegram)
sämtliche weitere zu speichernde Telegramme und die Methode take()
liefert noch alle bisher gespeicherten Telegramme und danach null
zurück. Eventuell blockierte Threads werden geweckt.
public void abort()
Diese Methode schließt die Verbindung und löscht alle noch gespeicherten Telegramme. Danach ignoriert die Methode put(Telegram)
sämtliche weitere zu speichernde Telegramme und die Methode take()
liefert anschließend immer null
zurück. Eventuell blockierte Threads werden geweckt.