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 Posts [Atom]
Kommentar veröffentlichen