Class PriorityChannel

java.lang.Object
de.bsvrz.sys.funclib.concurrent.PriorityChannel

public class PriorityChannel
extends java.lang.Object
Diese Klasse implementiert einen größenbeschränkten Kommunikationskanal zum Datenaustausch zwischen Threads. Es stehen Funktionen zur Verfügung mit den Objekte in den Kommunikationskanal übertragen werden bzw. aus dem Kommunikationskanal ausgelesen werden. Wenn die gewünschte Funktion nicht durchgeführt werden kann, weil der Kanal voll bzw. leer ist, dann blockiert die Funktion, bis die Funktion erfolgreich durchgeführt wurde oder bis eine vorgegebene Zeit verstrichen ist. Der Kommunikationskanal ist priorisiert, d.h. es können Objekte verschiedener Prioritätsklassen ausgetauscht werden, wobei die Objekte mit der kleinsten Prioritätsklasse bevorzugt behandelt werden. Objekte der gleichen Prioritätsklasse werden in der Reihenfolge ausgelesen in der sie in den Kommunikationskanal übertragen wurden (im Gegensatz zu Heap basierten Implementierungen). Der Aufwand des Auslesens von Objekten ist proportional zur Anzahl verschiedener Prioritätsklassen.
  • Constructor Summary

    Constructors
    Constructor Description
    PriorityChannel​(int numberOfPriorityClasses, int capacityPerPriorityClass)
    Legt einen neuen Kommunikationskanal an.
  • Method Summary

    Modifier and Type Method Description
    void clear()
    Löscht alle im Kommunikationskanal vorhandenen Nachrichten.
    boolean isEmpty()
    Bestimmt, ob der Kommunikationskanal leer ist.
    boolean offer​(PriorizedObject item, long timeout)
    Überträgt eine Nachricht in den Kommunikationskanal.
    PriorizedObject poll​(long timeout)
    Empfängt und entfernt eine Nachricht aus dem Kommunikationskanal.
    void put​(PriorizedObject item)
    Überträgt eine Nachricht in den Kommunikationskanal.
    PriorizedObject take()
    Empfängt und entfernt eine Nachricht aus dem Kommunikationskanal.

    Methods inherited from class java.lang.Object

    clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
  • Constructor Details

    • PriorityChannel

      public PriorityChannel​(int numberOfPriorityClasses, int capacityPerPriorityClass)
      Legt einen neuen Kommunikationskanal an.
      Parameters:
      numberOfPriorityClasses - Anzahl der zu verwendenden Prioritätsklassen. Diese sind von 0 bis numberOfPriorityClasses-1 durchnummeriert.
      capacityPerPriorityClass - Maximale Anzahl der pro Prioritätsklasse im Kommunikationskanal gespeicherten Objekte.
  • Method Details

    • put

      public void put​(PriorizedObject item) throws java.lang.InterruptedException
      Überträgt eine Nachricht in den Kommunikationskanal. Wenn die Kapazität des Kommunikationskanals in der jeweiligen Prioritätsklasse der Nachricht erschöpft ist, dann blockiert die Methode, bis wieder Platz vorhanden ist und das Objekt in den Kommunikationskanal übertragen wurde.
      Parameters:
      item - Objekt, das in den Kommunikationskanal übertragen werden soll.
      Throws:
      java.lang.InterruptedException - Wenn der Thread unterbrochen wurde, während auf freien Platz im Kommunikationskanal gewartet wurde.
    • offer

      public boolean offer​(PriorizedObject item, long timeout) throws java.lang.InterruptedException
      Überträgt eine Nachricht in den Kommunikationskanal. Wenn die Kapazität des Kommunikationskanals in der jeweiligen Prioritätsklasse der Nachricht erschöpft ist, dann blockiert die Methode, bis wieder Platz vorhanden ist und das Objekt in den Kommunikationskanal übertragen wurde oder bis die angegebene Timeout-Zeit verstrichen ist.
      Parameters:
      item - Objekt, das in den Kommunikationskanal übertragen werden soll.
      timeout - Zeit in Millisekunden, für die bei vollem Kommunikationskanal maximal auf freien Platz gewartet wird.
      Throws:
      java.lang.InterruptedException - Wenn der Thread unterbrochen wurde, während auf freien Platz im Kommunikationskanal gewartet wurde.
    • take

      public PriorizedObject take() throws java.lang.InterruptedException
      Empfängt und entfernt eine Nachricht aus dem Kommunikationskanal. Wenn der Kommunikationskanal leer ist, dann wartet die Methode, bis eine Nachricht in den Kommunikationskanal gesendet wurde. Der Kommunikationskanal ist priorisiert, d.h. es können Objekte verschiedener Prioritätsklassen ausgetauscht werden, wobei die Objekte mit der kleinsten Prioritätsklasse bevorzugt behandelt werden. Objekte der gleichen Prioritätsklasse werden in der Reihenfolge ausgelesen in der sie in den Kommunikationskanal übertragen wurden (im Gegensatz zu Heap basierten Implementierungen). Der Aufwand des Auslesens von Objekten ist proportional zur Anzahl verschiedener Prioritätsklassen.
      Returns:
      Empfangene Nachricht.
      Throws:
      java.lang.InterruptedException - Wenn der Thread unterbrochen wurde, während auf Nachrichten gewartet wurde.
    • poll

      public PriorizedObject poll​(long timeout) throws java.lang.InterruptedException
      Empfängt und entfernt eine Nachricht aus dem Kommunikationskanal. Wenn der Kommunikationskanal leer ist, dann wartet die Methode, bis eine Nachricht in den Kommunikationskanal gesendet wurde oder bis die angegebene Zeit verstrichen ist. Der Kommunikationskanal ist priorisiert, d.h. es können Objekte verschiedener Prioritätsklassen ausgetauscht werden, wobei die Objekte mit der kleinsten Prioritätsklasse bevorzugt behandelt werden. Objekte der gleichen Prioritätsklasse werden in der Reihenfolge ausgelesen in der sie in den Kommunikationskanal übertragen wurden (im Gegensatz zu Heap basierten Implementierungen). Der Aufwand des Auslesens von Objekten ist proportional zur Anzahl verschiedener Prioritätsklassen.
      Parameters:
      timeout - Zeit in Millisekunden, für die bei leerem Kommunikationskanal auf neue Nachrichten gewartet wird.
      Returns:
      Empfangene Nachricht oder null, wenn nach Ablauf des Timeouts immer noch keine Nachricht im Kommunikationskanal vorhanden ist.
      Throws:
      java.lang.InterruptedException - Wenn der Thread unterbrochen wurde, während auf Nachrichten gewartet wurde.
    • isEmpty

      public boolean isEmpty()
      Bestimmt, ob der Kommunikationskanal leer ist.
      Returns:
      true bei leerem Kommunikationskanal, sonst false.
    • clear

      public void clear()
      Löscht alle im Kommunikationskanal vorhandenen Nachrichten.