BPJ
BPJ is a behavioral programming library for Java. A BPJ program consists
of behavioral bthreads, a.k.a BThreads. Each such thread is an instance
of a class that extends bp.BThread
and overrides
the runBThread()
method. BThreads collaborate by calling
the bSync()
method...
In each iteration of the behavioral execution cycle :
- All b-threads synchronize and place their "bids":
- Requesting an event: proposing that the event be considered for triggering, and asking to be notified when it is triggered.
- Waiting for an event: without proposing its triggering, asking to be notified when the event is triggered.
- Blocking an event: forbidding the triggering of the event, vetoing requests of other b-threads.
- An event that is requested and not blocked is selected.
- b-threads that requested or wait for the selected event are notified.
- The notified b-threads progress to their next states, where they place new bids.
BPJ by examples
Incremental development of a system for controlling water level in a tank with hot and cold water sources. The b-thread 'Add hot' repeatedly requests five times the event AddHot. The b-thread 'Add cold' performs a similar action with the event AddCold, reflecting a separate requirement, which was introduced when adding five water quantities proved to be insufficient. When the two b-threads run simultaneously, with the first at a higher priority, the runs will include five consecutive AddHot events followed by five AddCold events. A new requirement is then introduced, to the effect that water temperature should be kept stable. We add the b-thread Interleave, to interleave AddHot and AddCold events.
Add hot
public class RequestFiveAddHotEvents extends BThread { public void runBThread() { for (int i = 1; i <= 5; i++) { bp.bSync(addHot, none, none); } } }
Add cold
public class RequestFiveAddColdEvents extends BThread { public void runBThread() { for (int i = 1; i <= 5; i++) { bp.bSync(addCold, none, none); } } }
Interleave
public class Interleave extends BThread { public void runBThread() { while (true) { bp.bSync(none, addHot, addCold); bp.bSync(none, addCold, addHot); } } }
Display events
public class DisplayEvents extends BThread { public void runBThread() throws BPJException { while (true) { bp.bSync(none, all, none); System.out.println("turned water tap: " + bp.lastEvent); } } }
Main method
public class Main { public static void main(String[] args) { BProgram bp = new BProgram(); bp.add(new AddHotThreeTimes(), 1.0); bp.add(new DisplayEvents(), 2.0); bp.add(new AddColdThreeTimes(), 3.0); bp.add(new Interleave(), 4.0); bp.startAll(); } }