HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:0 Y- |/ \2 M7 s0 L
( h0 Q$ g( l5 x+ p* V5 H public Object buildActions () {! Y. P& D1 [/ m9 ~5 y& O( T, r) j7 \! C0 [
super.buildActions();# Y; [ }- h3 v9 Y7 G& n4 K
3 p, A, F1 V7 y // Create the list of simulation actions. We put these in% \2 r7 {4 r' `0 K) P9 _
// an action group, because we want these actions to be, ~9 e% |& F+ p! @8 R. s
// executed in a specific order, but these steps should
; h0 d" T5 w* y8 e% M // take no (simulated) time. The M(foo) means "The message
: t1 D/ s. G2 @! o: P% V1 p // called <foo>". You can send a message To a particular: ], X1 `3 M: d5 a1 L; F1 N
// object, or ForEach object in a collection.
: `4 f0 K; P% p& f& ` 5 I4 _# a7 M, [5 R# u4 y# x; C
// Note we update the heatspace in two phases: first run9 X* Y& Z: B; |3 I8 M8 K8 h6 F" ^# K
// diffusion, then run "updateWorld" to actually enact the4 N3 v% w$ D$ o1 p1 ?7 w6 r8 d
// changes the heatbugs have made. The ordering here is( _! w' h, g) _7 V; ]- ?, v
// significant!
" X+ G% Z/ G0 O: h8 } ' o: {/ E7 _( T8 ?
// Note also, that with the additional
$ j F D9 |3 F. ?4 b" T! s // `randomizeHeatbugUpdateOrder' Boolean flag we can
% h5 `6 M- V0 D+ g0 U' T: [ // randomize the order in which the bugs actually run
8 q9 p& K( D" _8 l, z2 h9 H // their step rule. This has the effect of removing any
, \& P# y; @+ P& E8 C j // systematic bias in the iteration throught the heatbug
' w8 D' _9 E( l' y& T // list from timestep to timestep
5 Q) h. w$ }; Z9 y1 u4 `2 A
7 P! y. K v( u // By default, all `createActionForEach' modelActions have4 `6 S' ?% [/ z8 C8 X
// a default order of `Sequential', which means that the, i* @/ G! ?0 k0 b; I! a' l
// order of iteration through the `heatbugList' will be" c$ c; H6 i7 U1 l3 r3 }" n5 w8 x+ ^
// identical (assuming the list order is not changed; \+ k/ |' q2 G1 I; H9 v ^
// indirectly by some other process).
$ G s. i+ ]) X3 _! i+ c2 e0 Z
4 S( s* F8 N* b' i [1 N modelActions = new ActionGroupImpl (getZone ());. n0 {; S- x& r" F; b; u( A9 }5 B6 k0 {
* K3 l1 n1 Y8 c/ L2 B. _2 {
try {
! x' e& L+ W' d( h* l, E% K9 ~. R+ y modelActions.createActionTo$message$ h9 d+ I) a) y0 o, B
(heat, new Selector (heat.getClass (), "stepRule", false));
& n6 x- T2 c$ z# t } catch (Exception e) {0 m6 Q8 a: N ^- Z) n. v
System.err.println ("Exception stepRule: " + e.getMessage ()); X$ [3 j7 _8 e6 l
}
3 w R% Y" }( n2 y% U) r( r) E- N5 \# q7 l3 ~
try {
: S% B0 Q5 O$ B+ y4 f Heatbug proto = (Heatbug) heatbugList.get (0);4 l, L8 j) O8 @1 ]- H2 r
Selector sel =
7 R# z' Y* a( W5 j. _$ p- J new Selector (proto.getClass (), "heatbugStep", false);7 B! @6 h7 d7 i5 _2 H( d& ~
actionForEach =$ s7 r: p/ s5 C
modelActions.createFActionForEachHomogeneous$call
% t" ~" U0 T$ e% ?$ e5 M (heatbugList,; L) K w" n2 m; A" C0 F2 h3 d+ B
new FCallImpl (this, proto, sel,
" [! H. Q1 T+ i) }+ w6 W3 w6 S new FArgumentsImpl (this, sel)));" @7 O5 D2 J0 K3 k
} catch (Exception e) {6 i ]" I6 [2 A4 |7 |1 J
e.printStackTrace (System.err);; v. r+ O6 ? Q) a* h/ I( @
}: G$ ]8 x8 Q4 t& d+ A1 C
, V E3 [3 U; b+ }1 |
syncUpdateOrder ();
6 z9 i& v2 r6 H" a' W8 R& X# O) }- f
try {
3 j- i0 Q( M2 W7 B' L' O modelActions.createActionTo$message : n7 p( U, p- l" F
(heat, new Selector (heat.getClass (), "updateLattice", false));6 j/ E7 V4 P' _7 H
} catch (Exception e) {
8 ] j( b3 S- {# T3 N8 f" h0 S System.err.println("Exception updateLattice: " + e.getMessage ());
" U* g: r0 `$ G$ m+ | L; ?+ b }0 V0 F4 g( J. J5 u, c1 W
3 T9 w5 W+ e; I% t' t( a6 v, s7 E // Then we create a schedule that executes the
# Z, G5 S) r8 Q! U8 h# [7 Z // modelActions. modelActions is an ActionGroup, by itself it
& t2 b ?+ L4 A6 g4 _ // has no notion of time. In order to have it executed in
8 n4 g9 j, z# q* }5 U // time, we create a Schedule that says to use the# n a; K/ _ P7 N: U. b) C u
// modelActions ActionGroup at particular times. This
! a. e+ y2 Z' y/ G' E E Q // schedule has a repeat interval of 1, it will loop every1 H- \/ O& |! g8 Z |
// time step. The action is executed at time 0 relative to- x' L; q% |( u. l# t- v4 N
// the beginning of the loop.3 n) m. p2 z% ]7 h6 ?; Y9 X
# |4 B& B9 I) U5 N/ M5 B+ S
// This is a simple schedule, with only one action that is
1 O1 x, {( J* r) p1 `! y // just repeated every time. See jmousetrap for more
" v, ]$ v0 f j: L // complicated schedules.
3 U! R- S2 L2 F" t0 A1 J . w% M) N; d' V. L8 j/ B8 u! E
modelSchedule = new ScheduleImpl (getZone (), 1);! V; n2 |3 X) ?5 @ o( w8 Q ~# I4 t
modelSchedule.at$createAction (0, modelActions);1 Y, @/ W2 s! N, @; }
$ @' X* C$ r( ]4 i' T2 W' {
return this;
9 @$ d: P1 s& B" d9 j: A# f } |