Shared Environment

The Environment

public class Environment {
   // Environment is a singleton:
   private static Environment theEnvironment = new Environment();
   public static Environment getTheEnvironment() {
      return theEnvironment;
   }
   private Environment() {}
   // this environment is a monitor & contains a bounded buffer:
   private static int CAP = 10; // buffer capacity
   private int count = 0; // # items in buffer
   public synchronized void add() {
      while(CAP <= count) {
         try {
            wait();
         } catch(InterruptedException ie) {
            System.err.println(ie.getMessage());
         }
      }
      System.out.println("adding item, count = " + ++count);
      notifyAll();
   }
   public synchronized void remove() {
      while(count <= 0) {
         try {
            wait();
         } catch(InterruptedException ie) {
            System.err.println(ie.getMessage());
         }
      }
      System.out.println("removing item, count = " + --count);
      notifyAll();
   }
}

Producer agent behavior

class ProducerBehavior extends Behaviour {
   private Environment env = Environment.getTheEnvironment();
   private int cycle = 0;
   public ProducerBehavior(Agent a) { super(a); }
   public void action() {
      System.out.print(myAgent.getLocalName() + ": ");
      env.add();
      cycle++;
   }
   public boolean done() { return 25 <= cycle; }

   public int onEnd() {
      myAgent.doDelete();
      return super.onEnd();
   }
}

Consumer agent behavior

class ConsumerBehavior extends Behaviour {
   private Environment env = Environment.getTheEnvironment();
   private int cycle = 0;
   public ConsumerBehavior(Agent a) { super(a); }
   public void action() {
      System.out.print(myAgent.getLocalName() + ": ");
      env.remove();
      cycle ++;
   }
   public boolean done() { return 25 <= cycle; }

   public int onEnd() {
      myAgent.doDelete();
      return super.onEnd();
   }
}

Output

C:\pearce\agents\Jade\jade>runjade P1:demos.Producer P2:demos.Producer C1:demos.

Agent P1 is ready!
Agent C1 is ready!
Agent P2 is ready!

C1: P2: adding item, count = 1
removing item, count = 0
P1: adding item, count = 1
P2: adding item, count = 2
C1: removing item, count = 1
P1: adding item, count = 2
P2: adding item, count = 3
C1: removing item, count = 2
P1: adding item, count = 3
P2: adding item, count = 4
C1: removing item, count = 3
P1: adding item, count = 4
P2: adding item, count = 5
C1: removing item, count = 4
P1: adding item, count = 5
P2: adding item, count = 6
C1: removing item, count = 5
P1: adding item, count = 6
P2: adding item, count = 7
C1: removing item, count = 6
P1: adding item, count = 7
P2: adding item, count = 8
C1: removing item, count = 7


P1: adding item, count = 8
P2: adding item, count = 9
C1: removing item, count = 8
P1: adding item, count = 9
P2: adding item, count = 10
C1: removing item, count = 9
P1: adding item, count = 10
P2: C1: removing item, count = 9
P1: adding item, count = 10
C1: removing item, count = 9
adding item, count = 10
P1: P2: C1: removing item, count = 9
adding item, count = 10
P1: C1: removing item, count = 9
adding item, count = 10
P2: C1: removing item, count = 9
adding item, count = 10
P1: C1: removing item, count = 9
adding item, count = 10
P2: C1: removing item, count = 9
adding item, count = 10
P1: C1: removing item, count = 9
adding item, count = 10
P2: C1: removing item, count = 9
adding item, count = 10
P1: C1: removing item, count = 9
adding item, count = 10
P2: C1: removing item, count = 9
adding item, count = 10
P1: C1: removing item, count = 9
adding item, count = 10
P2: C1: removing item, count = 9
adding item, count = 10
P1: C1: removing item, count = 9
adding item, count = 10
P2: C1: removing item, count = 9
adding item, count = 10
P1: Agent C1 is shutting down