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();
}
}
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();
}
}
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();
}
}
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