HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:2 {5 {. e" J( X) B5 k& v0 z* s/ I
9 w2 x) g5 w& [! z ?% x
public Object buildActions () {
+ I. K' s& Z5 f! R( k super.buildActions();* Y+ a5 ?4 A/ i# D' ?! \+ l
8 h. k8 t- g, V- V6 b6 T2 _ // Create the list of simulation actions. We put these in
8 i: `: S" L, |! j, Z& { // an action group, because we want these actions to be
/ J8 }" T: y( b' I7 k+ F2 o // executed in a specific order, but these steps should% O# S5 e4 n8 w" S' S
// take no (simulated) time. The M(foo) means "The message
/ A; m' V; [( v1 u // called <foo>". You can send a message To a particular3 H8 y. f2 j- p" n# `" W& o
// object, or ForEach object in a collection.+ K8 H$ H! H* N& E
& Q( O3 c% m. @8 e
// Note we update the heatspace in two phases: first run& u! T% x4 m& ?% s3 M$ A! A' T
// diffusion, then run "updateWorld" to actually enact the
! A) ?0 c; r$ @# J // changes the heatbugs have made. The ordering here is, x/ r4 \* s3 {; \; A9 r! K9 \' [
// significant!+ L A3 d* W; X5 S2 S
" }( L, ]3 U! u9 k3 @/ X5 k* w
// Note also, that with the additional5 M5 r2 ^& E2 Y4 D
// `randomizeHeatbugUpdateOrder' Boolean flag we can" y& p/ i5 b0 `8 ^1 N! m. t
// randomize the order in which the bugs actually run+ W6 V. j- l! Z
// their step rule. This has the effect of removing any# w8 b- v* c- L# @' j
// systematic bias in the iteration throught the heatbug
. s8 S* y% G% D. b- v // list from timestep to timestep
* D% T; q" c6 K! V, l- r 6 c* J1 M/ q: Z
// By default, all `createActionForEach' modelActions have
$ }# c- X4 i( \, U. c1 b) B' K // a default order of `Sequential', which means that the
( u% }% G4 G( |$ _3 E- W/ B. X1 E // order of iteration through the `heatbugList' will be
; \% K$ ?! E- Q1 j // identical (assuming the list order is not changed
$ f, [/ a0 H0 q: S2 E! T // indirectly by some other process).# l+ v u0 L* V* f/ }9 R$ E$ |. ?
4 n% ~$ L; A- S1 ]% O. _
modelActions = new ActionGroupImpl (getZone ());
- t( q* M% w" {0 L' K/ L$ y: W" _+ \
7 y- M# X% t# ~" {% ~2 D y3 c try {
' n$ D" p) u1 e& [ modelActions.createActionTo$message, c/ p0 ?9 {0 K6 X. {
(heat, new Selector (heat.getClass (), "stepRule", false));( e2 J+ k! s% ^3 Q& M$ f ^" k
} catch (Exception e) {9 N4 O; E/ ~9 g7 l4 i- f8 }! N
System.err.println ("Exception stepRule: " + e.getMessage ());
- K% H7 o+ d) E0 [. L4 B }
- u+ h9 _4 A! L5 x' b& d# C; P+ z# _, I" S( @$ V$ C4 g+ E
try {
( X, q1 j/ e# W7 n Heatbug proto = (Heatbug) heatbugList.get (0);
! S) @' j+ f* Y: h0 A- V' U Selector sel =
: D8 r& H r! G5 i new Selector (proto.getClass (), "heatbugStep", false);
% h) r1 V- x! u9 q9 c actionForEach =
; w2 R4 G0 s' { [! [ modelActions.createFActionForEachHomogeneous$call( ?( O; |8 C4 W$ k x9 y5 O
(heatbugList,+ D( b+ c' x9 |* b5 {7 A
new FCallImpl (this, proto, sel,
! G2 s- ^. M4 x; V0 S; f* ` new FArgumentsImpl (this, sel)));6 ]- p0 e4 E) c0 ]: c
} catch (Exception e) {
. ~/ G" ^ f1 n0 r& n0 p; K e.printStackTrace (System.err);
) V5 o, n4 Q! V& H* |9 x }7 y4 ?3 X% `" V; i, U- R# w
! N5 E, }2 T7 i3 j) g. X9 _$ P
syncUpdateOrder ();1 }6 D/ W- z6 O* o$ a- [4 C8 j
# V% Y6 M% v+ y4 F) M( ?6 a0 w try {8 v/ d! v8 H( ~3 k
modelActions.createActionTo$message * k: k# C5 r+ v0 Y% g f
(heat, new Selector (heat.getClass (), "updateLattice", false));
! V; Q: l5 b" x* u4 l$ z5 o } catch (Exception e) {
5 O S5 N, q8 \! Z5 x8 b6 w: M System.err.println("Exception updateLattice: " + e.getMessage ());
9 d4 [' ^. E9 }" I( X; }. R6 U }" G% e; L0 C! ]/ @1 V
3 U2 w# h9 q3 h& z! K9 a
// Then we create a schedule that executes the( z) [4 ~2 F. p/ R0 N% P7 F
// modelActions. modelActions is an ActionGroup, by itself it3 z' c9 P/ |( P& l& @
// has no notion of time. In order to have it executed in
$ u! n, v# n. ?, g // time, we create a Schedule that says to use the
# r4 Q* ]; Y: Z* L* V" m // modelActions ActionGroup at particular times. This9 R J5 H( A) O L% X$ V% e
// schedule has a repeat interval of 1, it will loop every2 D; d# S) `, G# F4 E& x V
// time step. The action is executed at time 0 relative to( b! y% {. J Y
// the beginning of the loop.
$ n5 g/ L! a5 P$ K1 y' O4 w3 E( s
// This is a simple schedule, with only one action that is
. Q! ^+ R* E4 ]% N1 R // just repeated every time. See jmousetrap for more* k3 Q4 u! k0 R* B
// complicated schedules.
( q J1 `" o1 k1 {
# [) [8 e; z: C/ j. i: J modelSchedule = new ScheduleImpl (getZone (), 1);
# M8 ^/ l$ A, \, k" ` modelSchedule.at$createAction (0, modelActions);8 l1 y4 C( C8 D N' Z+ S
4 r( l, s7 v( t) T" Y' P, Z) G/ A* [ return this;0 B0 E$ [! i) @0 d- c6 l* K
} |