Freitag, 18. März 2011

 

Experimente mit Queues (POS1-2: 2A, 2C, PR: 5A, 5B)

Implementieren Sie im Package 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: , , ,


Kommentare:

Kommentar veröffentlichen

Abonnieren Kommentare zum Post [Atom]





<< Startseite

This page is powered by Blogger. Isn't yours?

Abonnieren Posts [Atom]