Freitag, 18. März 2011
Experimente mit Queues (POS1-2: 2A, 2C, PR: 5A, 5B)
Implementieren Sie im Package
Als Testklasse verwenden Sie bitte die folgende Klasse
Experimentieren Sie mit unterschiedlichen Wartezeiten, sodass die Queue (Ringpuffer) voll bzw. leer werden kann. Was passiert?
Wenn die Queue nicht synchronisiert wird, was kann passieren? Können Sie das Verhalten in Experimenten nachweisen?
Bauen Sie entsprechendes
Source Code
ringbuffer eine Klasse Queue für Integer-Werte. Implementieren Sie die Queue in Form eines Ringpuffers. Es soll die Exception QueueFullException geworfen werden, wenn der Ringpuffer voll ist und die Exception QueueEmptyException, wenn der Ringpuffer leer ist.Als Testklasse verwenden Sie bitte die folgende Klasse
QueueTest, welche zwei Threads erzeugt. Einen Sender, der zufällige "Nachrichten" (Integerwerte) in die Warteschlange steckt und einen Empfänger, der Werte aus der Warteschlange entnimmt. Beide geben jeweils die gesendete bzw. gelesene Nachricht aus. Beide Threads haben unterschiedliche zufällige Wartezeiten.Experimentieren Sie mit unterschiedlichen Wartezeiten, sodass die Queue (Ringpuffer) voll bzw. leer werden kann. Was passiert?
Wenn die Queue nicht synchronisiert wird, was kann passieren? Können Sie das Verhalten in Experimenten nachweisen?
Bauen Sie entsprechendes
synchronized in Ihre Queue ein (5. Klasse). Was muss synchronisiert werden?Source Code
/**
* java-queue: ringbuffer.QueueTest.java
*
* 17.03.2011, Harald R. Haberstroh
*/
package ringbuffer;
import java.util.Random;
/**
* Testen der Queue mit 2 Threads.
*
* @author Harald R. Haberstroh (hp)
*
*/
public class QueueTest extends Thread {
private final static int MAXRUNS = 20;
private Queue messages;
private Random rnd = new Random();
public QueueTest(String name, Queue messages) {
super(name);
this.messages = messages;
}
public void run() {
if (getName().equalsIgnoreCase("Sender")) {
for (int i = 0; i < MAXRUNS; i++) {
int msg = rnd.nextInt(100);
long sleepTime = (long) rnd.nextInt(500) + 500; // 500-1000ms
try {
System.out.println(getName() + " sending " + msg);
messages.put(msg);
} catch (QueueFullException e) {
System.err.println(getName() + ":Oops - Queue full");
}
try {
sleep(sleepTime);
} catch (InterruptedException e) {
System.err.println(getName() + ":Oops - interrupted");
}
}
} else { // Receiver
setName(" " + getName()); // Einrückung
for (int i = 0; i < MAXRUNS || !messages.isEmpty(); i++) {
long sleepTime = (long) rnd.nextInt(900) + 600; // 900-1500ms
try {
if (!messages.isEmpty()) {
System.out.println(getName() + " read " + messages.get());
}
} catch (QueueEmptyException e) {
System.err.println(getName() + ": Oops - Queue empty");
}
try {
sleep(sleepTime);
} catch (InterruptedException e) {
System.err.println(getName() + ":Oops - interrupted");
}
}
}
System.out.println(getName() + " finished");
}
public String toString() {
return getName();
}
/**
* @param args
*/
public static void main(String[] args) {
Queue messages = new Queue();
QueueTest sender = new QueueTest("Sender", messages);
QueueTest receiver = new QueueTest("Receiver", messages);
sender.start();
receiver.start();
try {
sender.join();
receiver.join();
} catch (InterruptedException e) {
System.err.println(e.getLocalizedMessage());
}
System.out.println(".... all finished ....");
}
}
Beispielausgabe bei Standardeinstellung
Sender sending 73
Sender sending 46
Receiver read 73
Sender sending 63
Receiver read 46
Sender sending 11
Receiver read 63
Sender sending 89
Sender sending 21
Receiver read 11
Sender sending 99
Receiver read 89
Sender sending 79
Sender sending 41
Receiver read 21
Sender sending 17
Receiver read 99
Sender sending 92
Receiver read 79
Sender sending 89
Receiver read 41
Sender sending 52
Receiver read 17
Sender sending 60
Receiver read 92
Sender sending 25
Receiver read 89
Sender sending 82
Sender sending 60
Receiver read 52
Sender sending 13
Sender sending 34
Receiver read 60
Sender sending 10
Receiver read 25
Sender finished
Receiver read 82
Receiver read 60
Receiver read 13
Receiver read 34
Receiver read 10
Receiver finished
.... all finished ....
Labels: Aufgabe, Java, POS1-2, PR5
Abonnieren Kommentare [Atom]
Kommentar veröffentlichen