HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
' p8 g4 P3 s* a. X* ], k
: [$ e5 O* z+ X& Q2 Q9 B9 ] public Object buildActions () {4 F7 C! X; Q; u3 E
super.buildActions();) Y H o8 d6 m* h5 X; d- U
' {1 y3 q- |/ D5 A* m( | // Create the list of simulation actions. We put these in* [/ P9 O, V, x7 ~4 D. f; k" r: F" R
// an action group, because we want these actions to be
' D) a6 W- D- b9 G% m1 ` // executed in a specific order, but these steps should
; \3 P6 C$ w$ Y8 G0 v // take no (simulated) time. The M(foo) means "The message& D9 r6 _- B# U- Z- o( u! h
// called <foo>". You can send a message To a particular! @7 G: e$ u' C$ b* ?+ l% z& K! t
// object, or ForEach object in a collection.6 a8 R3 T: k0 a ~
7 f5 z5 |" F- C; j N3 ?4 n* k
// Note we update the heatspace in two phases: first run" q# s1 Y: a/ H3 \7 s) v. |
// diffusion, then run "updateWorld" to actually enact the
m8 ?6 v0 U# d+ ] o6 t' z" K0 H: l& m. A // changes the heatbugs have made. The ordering here is
- t, i+ N3 O( o8 S- ? // significant!
" ~* s* n+ a B * G7 Z% Q k+ E- t
// Note also, that with the additional
9 x& \) H3 W1 S* m+ O' H // `randomizeHeatbugUpdateOrder' Boolean flag we can. L5 I" n; P+ ~
// randomize the order in which the bugs actually run, S0 ~& H' W; S1 J
// their step rule. This has the effect of removing any
' j: y' k0 B6 z! ?; t3 h: p+ T // systematic bias in the iteration throught the heatbug. G2 R" J% V+ Z
// list from timestep to timestep
" C& j0 X/ v* d# F F' |) Z, D3 o# ~
+ ^7 z8 p) a W3 c8 x* H8 l' S/ _ // By default, all `createActionForEach' modelActions have
3 J" ]& r& D/ M+ I) J3 o // a default order of `Sequential', which means that the6 @; d2 j# o8 K, A# S
// order of iteration through the `heatbugList' will be* X M1 B* n9 W+ q' u8 h( c
// identical (assuming the list order is not changed
5 b6 Y! @# ~, h. i" x: A! l // indirectly by some other process).! T. H# r% S1 U& {* N
& C* V8 f p; j p
modelActions = new ActionGroupImpl (getZone ());, y) M1 C8 J6 R/ ]1 S
# F- E1 S$ C: _
try {6 a8 f3 J/ I2 [1 ?8 `3 |8 i
modelActions.createActionTo$message" |. ^& g" A0 O
(heat, new Selector (heat.getClass (), "stepRule", false));3 L3 B, h# p# C1 e
} catch (Exception e) {
5 s. N2 T: ^+ f$ T1 t& s$ q# ? System.err.println ("Exception stepRule: " + e.getMessage ());: h) a1 F. I; `4 N
}
( }; L6 G/ T, a( D. I* P7 d% R1 @/ ^3 O$ c
try {+ |4 i; U: D$ m5 Q/ \
Heatbug proto = (Heatbug) heatbugList.get (0);
8 R5 ^$ n9 Q# @: b+ g2 Y6 `! O& k Selector sel = , b, ]6 x$ e2 h8 y
new Selector (proto.getClass (), "heatbugStep", false);9 _3 N+ W0 Q+ _" T; b! H/ P
actionForEach =
0 _- y7 {2 [) w$ ] modelActions.createFActionForEachHomogeneous$call, H0 m m- P2 j0 C* y0 D; w
(heatbugList,7 v, \0 C$ T. h; e/ d1 q
new FCallImpl (this, proto, sel,
+ w: S! K+ C# R! o# @& M* S) D new FArgumentsImpl (this, sel)));: `0 \- _1 f2 u4 `$ L
} catch (Exception e) {* s* b& ?+ _" a0 s& K) m, C
e.printStackTrace (System.err);
! Y2 @* }2 Q9 T( u }: {9 n% i4 ?8 z. n
0 L; _( e- U$ y+ z$ j3 {- g syncUpdateOrder ();
6 n6 v% Y ]5 ^' p& \& L: C) V6 l. q5 B: k8 {* ?* I9 `' ~+ ^
try {
9 ^2 u5 [4 R) e modelActions.createActionTo$message & w y: j! Y6 g: E: Q) {
(heat, new Selector (heat.getClass (), "updateLattice", false));
* N9 ~3 k+ @: G6 a! I2 ? } catch (Exception e) {
9 j4 v6 C# j' _5 ^ System.err.println("Exception updateLattice: " + e.getMessage ());
7 L$ Z' i) x, M# [ }0 z( P P/ g! S( w1 P: g% Y
7 j5 H9 n/ ], `7 r( |3 r // Then we create a schedule that executes the
* j. r$ z& u& t; ^7 Y* C // modelActions. modelActions is an ActionGroup, by itself it' o, f o! n; l
// has no notion of time. In order to have it executed in5 f. T7 {# k$ I
// time, we create a Schedule that says to use the
1 d' h) {0 l1 e0 a: m9 _9 c // modelActions ActionGroup at particular times. This
( N) B5 |4 i0 s' O) H( V, m // schedule has a repeat interval of 1, it will loop every
3 E9 b1 R0 I+ c1 t) s // time step. The action is executed at time 0 relative to
, e9 K7 I I) y: C! O$ u5 F" V, g // the beginning of the loop.
$ {3 |. y) A. R
5 i) g* F0 q; e0 o7 c // This is a simple schedule, with only one action that is! F2 W+ u2 ]% Z4 @ Y: R0 D
// just repeated every time. See jmousetrap for more
9 H; q' W7 S" Q) q5 a // complicated schedules.
0 S4 Q7 U' h+ q/ }1 ? ~7 L) U1 O
. ]6 H I; x9 S6 E- c7 g) ~2 z2 }4 H modelSchedule = new ScheduleImpl (getZone (), 1);
- F, @; B7 b' P% Y; L# R modelSchedule.at$createAction (0, modelActions);
7 F8 c, H- n6 V* C0 B `
( k8 {# r- B& }& k" K return this;2 j) X! V4 T* K( d) Y% a9 j
} |