...
Actor code is processed in chunks separated by quiet periods of waiting for new events (messages). This can be naturally modeled through continuations. As JVM doesn't support continuations directly, they have to be simulated in the actors frameworks, which has slight impact on organization of the actors' code. However, the benefits in most cases outweigh the difficulties.
| Code Block |
|---|
import groovyx.gpars.actor.Actor
import groovyx.gpars.actor.DefaultActor
class GameMaster extends DefaultActor {
int secretNum
void afterStart() {
secretNum = new Random().nextInt(10)
}
void act() {
loop {
react { int num ->
if (num > secretNum)
reply 'too large'
else if (num < secretNum)
reply 'too small'
else {
reply 'you win'
terminate()
}
}
}
}
}
class Player extends DefaultActor {
String name
Actor server
int myNum
void act() {
loop {
myNum = new Random().nextInt(10)
server.send myNum
react {
switch (it) {
case 'too large':
println "$name: $myNum was too large"
break
case 'too small':
println "$name: $myNum was too small"
break
case 'you win':
println "$name: I won $myNum"; terminate()
}
}
}
}
}
def master = new GameMaster().start()
def player = new Player(name: 'Player', server: master).start()
[master, player]*.join()
|
...
For more details on Actors visit the Actors section of the User Guide.
Please also see the numerous Actor Demos.