Hallo zusammen!
Kurze Frage: Ich habe eine selbst implementierte Datenstruktur FIFO-Queue, welche Objekte jeglicher Art aufnehmen und nach dem FIFO-Prinzip ausgeben kann. Diese enthält zur Sicherstellung der Thread-Sicherheit synchronisierte Methoden dafür.
Hier erstmal der Code:
FFIFOQueue.java
Folgende Threads sollen nebenläufig lesen bzw. schreiben.
ReaderThread.java:
WriterThread.java
QueueApplication.java
Meine Frage ist nun, wie ich nun durch Unit-Tests sicherstellen kann, das die Syncronisation wirklich korrekt ausgeführt wird...Die Ausgaben via System.out sind schon korrekt, allerdings ist das kein akzeptabler Test....
Bin für jede Anregung dankbar...und Danke im Voraus!
Kurze Frage: Ich habe eine selbst implementierte Datenstruktur FIFO-Queue, welche Objekte jeglicher Art aufnehmen und nach dem FIFO-Prinzip ausgeben kann. Diese enthält zur Sicherstellung der Thread-Sicherheit synchronisierte Methoden dafür.
Hier erstmal der Code:
FFIFOQueue.java
Code:
public class FIFOQueue
{
private Object[] container; //Storage for the elements in the queue
private int numElements = 0; //Number of elements in the queue
private int readIndex = 0; //First element in the queue
private int writeIndex = 0; //Next available index in the storage
public FIFOQueue(final int capacity)
{
container = new Object[capacity];
}
public synchronized void put(Object element) {
while(numElements == container.length) {
try {
System.out.println("----QUEUE is full! " + Thread.currentThread().getName() + " has to wait.");
wait();
}
catch (InterruptedException ex) {
ex.printStackTrace();
}
}
container[writeIndex] = element;
System.out.println("----Put: " + element.toString());
writeIndex = (writeIndex + 1) % container.length;
numElements++;
notify();
}
public synchronized Object get() {
while(numElements == 0) {
try {
System.out.println("----QUEUE is empty! " + Thread.currentThread().getName() + " has to wait!");
wait();
} catch (InterruptedException ex) {
ex.printStackTrace();
}
}
final Object element = container[readIndex];
container[readIndex] = null;
readIndex = (readIndex + 1) % container.length;
numElements--;
notify();
System.out.println("----Get: " + element.toString());
return element;
}
}
Folgende Threads sollen nebenläufig lesen bzw. schreiben.
ReaderThread.java:
Code:
public class ReaderThread extends Thread
{
private FIFOQueue queue;
public ReaderThread(final FIFOQueue queue, final String name)
{
super(name);
this.queue = queue;
}
public void run() {
for(int i=0; i<=10; i++) {
queue.get();
try {
Thread.sleep(4000); //Just for demonstration purposes
} catch (InterruptedException e) {
e.printStackTrace();
}
}
System.out.println("Reader-Thread finished!");
}
}
WriterThread.java
Code:
public class WriterThread extends Thread
{
private FIFOQueue queue;
private String[] data = {"One", "Two", "Three", "Four", "Five", "Six", "Seven", "Eight", "Nine", "Ten"};
public WriterThread(final FIFOQueue queue, final String name)
{
super(name);
this.queue = queue;
}
public void run() {
for(int i=0; i<data.length; i++) {
queue.put(data[i]);
}
System.out.println("Writer-Thread finished!");
}
}
QueueApplication.java
Code:
public class QueueApplication {
public static void main(String[] args) {
FIFOQueue queue = new FIFOQueue(5);
Thread reader = new ReaderThread(queue, "Reader-Thread");
Thread writer = new WriterThread(queue, "Writer-Thread");
reader.start();
writer.start();
try {
reader.join();
writer.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
Meine Frage ist nun, wie ich nun durch Unit-Tests sicherstellen kann, das die Syncronisation wirklich korrekt ausgeführt wird...Die Ausgaben via System.out sind schon korrekt, allerdings ist das kein akzeptabler Test....

Bin für jede Anregung dankbar...und Danke im Voraus!