HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
" H3 u% E- O! D* z
1 E/ K8 q" A# M3 L+ y8 U) G2 k1 M public Object buildActions () { D \( X& h- B
super.buildActions();
4 q6 F- i3 q5 R' E! T1 R8 t7 p : d2 _5 G5 `0 n g n
// Create the list of simulation actions. We put these in% f1 B; M r* \. O9 \4 }- T: T. M
// an action group, because we want these actions to be
: f, H! N* V9 h, V! v/ @, i$ s4 I // executed in a specific order, but these steps should
$ t- E3 p. ]( j! U; ^( n8 c- d // take no (simulated) time. The M(foo) means "The message1 u7 F: }3 d& a3 G7 E: \0 c
// called <foo>". You can send a message To a particular+ O& t) g' d# p3 q! A1 m0 C( `0 b: Y
// object, or ForEach object in a collection.4 G; E+ p; q0 Y! a, |8 r) g# v
: k7 y2 d% u) ?; ] // Note we update the heatspace in two phases: first run
% A7 M* o9 X' P1 S // diffusion, then run "updateWorld" to actually enact the6 W0 P; F$ J4 t: o. H2 ~, q2 _, z
// changes the heatbugs have made. The ordering here is
& T( j; s7 v7 ~* N/ j1 @ // significant!
2 s0 D5 C! u e; k4 E6 b/ ^
6 b# G$ M$ k' B4 F3 T% w: s& t' G // Note also, that with the additional3 ] f8 b0 D- O4 m7 S6 T+ R
// `randomizeHeatbugUpdateOrder' Boolean flag we can5 ?8 l' g- m0 h' C1 N* y: i. ~/ U
// randomize the order in which the bugs actually run! ?% c2 ]. A# ]3 K# ]0 A- G+ w0 T
// their step rule. This has the effect of removing any
: ]* }+ C1 Q' A# D1 s0 ?3 J // systematic bias in the iteration throught the heatbug' E0 V2 _9 c2 c/ w
// list from timestep to timestep
0 g, v) s. a6 d/ B) A8 E 2 L; y. |2 \- J' O6 \/ s7 q
// By default, all `createActionForEach' modelActions have0 e/ ~4 |/ q" G' a$ Q
// a default order of `Sequential', which means that the
$ _+ K; `4 }! T/ i; w. | // order of iteration through the `heatbugList' will be# a3 M5 V" A% W* ]0 H
// identical (assuming the list order is not changed
$ O' ^( h" H, p; C& h* ^4 a // indirectly by some other process).& |( Y! o* e' U( G) O3 `! o4 ^
; F5 t2 G0 v4 ^5 c! g2 }% h modelActions = new ActionGroupImpl (getZone ());+ A, _. s. I* L0 f% Z8 m0 G0 l, `
! U5 R4 O8 I# a% v; \% _! O try {% z) D6 F% K; F, `2 C' _
modelActions.createActionTo$message4 z: J8 L; B: G) p5 O
(heat, new Selector (heat.getClass (), "stepRule", false));0 X$ ^5 E- V; l" u
} catch (Exception e) {# X1 S% D& `: T t! O d* u
System.err.println ("Exception stepRule: " + e.getMessage ());
+ H& Y9 b8 \2 E3 ~ }
; t& Z3 T1 `# n* f) T/ s. w; w: r: H+ }7 r
try {+ D6 W' U1 }' U% p$ u
Heatbug proto = (Heatbug) heatbugList.get (0);2 S3 d7 J7 y9 m4 o* [2 n4 l
Selector sel =
: z+ n, k) |8 p0 H new Selector (proto.getClass (), "heatbugStep", false);% U) `- D! u8 `; q" h5 t$ b) q( R
actionForEach =& N3 p- H4 f1 M& v1 v/ ~( g9 n8 J$ C' \
modelActions.createFActionForEachHomogeneous$call# R% C& E) C; f6 e0 B! h2 ^
(heatbugList,& K3 D- i/ `( e" @5 ~. s( {/ t
new FCallImpl (this, proto, sel,; ?! a+ `+ l2 P) m: w
new FArgumentsImpl (this, sel)));
( u v, n0 O$ o1 ? } catch (Exception e) {
: ] P- P8 O1 ^% Q e.printStackTrace (System.err);
( ]8 V( Z$ @! R5 y7 h6 l. A# B# } }5 R; B8 h& x6 I; s& O# E0 G
- L. k/ o7 U. d/ G* R6 M& I0 }1 ^3 z
syncUpdateOrder ();
8 n3 U1 X: g4 h: ~9 _7 R+ w& ~6 _7 Y/ Q+ i: C
try {2 J( U& \8 `/ S; I1 [+ q
modelActions.createActionTo$message
* |" `- }' N! Q8 n8 q3 z4 ^& ` (heat, new Selector (heat.getClass (), "updateLattice", false));! h: U7 e) V3 v
} catch (Exception e) {
0 r; o \8 J0 Q$ p; M8 c System.err.println("Exception updateLattice: " + e.getMessage ());
8 ^+ X5 D8 |- n% F# F& t8 r }
5 D! l- n6 w' N- D: o6 c % o# Z0 W9 c9 ?2 R
// Then we create a schedule that executes the7 q; B7 \6 k5 Z+ b' j# r6 ^5 q
// modelActions. modelActions is an ActionGroup, by itself it8 H2 S+ c0 _+ b0 X7 l0 u
// has no notion of time. In order to have it executed in2 a' H6 H* f8 A* K( W- l/ h
// time, we create a Schedule that says to use the# h1 R" d6 B9 y) U. J6 X
// modelActions ActionGroup at particular times. This
) e+ Z$ R+ Y4 Z: y. K // schedule has a repeat interval of 1, it will loop every
0 A8 A' |/ d6 p; h5 z! h // time step. The action is executed at time 0 relative to+ m! K, I1 t: c/ Y( I# Z7 z
// the beginning of the loop.( G5 E, X, L# M! Z" V- ^& O3 r
& v2 o. k* `) i+ z) J3 K8 n9 ` // This is a simple schedule, with only one action that is6 s" Y$ \& T8 X, A' `
// just repeated every time. See jmousetrap for more
4 |$ g; c1 `1 ? // complicated schedules.9 N$ L4 a4 F+ \9 v8 r, d
: \( d2 s C0 B modelSchedule = new ScheduleImpl (getZone (), 1); u/ o3 Z; H) ` ?. u2 P
modelSchedule.at$createAction (0, modelActions);3 Z; B; m, G3 n0 t! o% W9 a
. ]3 X7 v# V6 }. k% }' {! K, N return this;
+ Z- q$ j) h/ T) L: ^5 z/ P- Y" u } |