Versions Compared


  • This line was added.
  • This line was removed.
  • Formatting was changed.
Comment: Migrated to Confluence 5.3

The Agent is a special-purpose thread-safe non-blocking reference implementation inspired by Agents in Clojure.


To wrap integers, we can certainly use AtomicXXX types of the Java platform. When the state or the update algorithms become more complex we need more support.


Code Block

import groovyx.gpars.agent.Agent

 * Conference stores number of registrations and allows parties to register and unregister.
 * It inherits from the Agent class and adds the register() and unregister() private methods,
 * which callers may use it the commands they submit to the Conference.
class Conference extends Agent<Long> {
    def Conference() { super(0) }
    private def register(long num) { data += num }
    private def unregister(long num) { data -= num }

final Agent conference = new Conference()  //new Conference created

 * Three external parties will try to register/unregister concurrently

final Thread t1 = Thread.start {
    conference << {register(10L)}               //send a command to register 10 attendees

final Thread t2 = Thread.start {
    conference << {register(5L)}                //send a command to register 5 attendees

final Thread t3 = Thread.start {
    conference << {unregister(3L)}              //send a command to unregister 3 attendees

[t1, t2, t3]*.join()
assert 12L == conference.val

For latest update, see the Agent section of the User Guide and the respective Demos.