HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:% R8 D( i5 |7 F3 p; `1 v% w$ p1 X
' [3 R5 F0 ^: i7 o' H% g" S public Object buildActions () {4 D. [% E. [8 ^# I% s9 [9 N
super.buildActions();/ m- `2 N% N+ ?0 _5 F. V* _* h
4 U; I/ t( o6 K
// Create the list of simulation actions. We put these in
& z; _; D& C0 B& t) y5 m3 s+ [ // an action group, because we want these actions to be8 K) v7 l" N. L* d) h* B3 j2 J7 ~1 Q4 n0 j
// executed in a specific order, but these steps should% ` [: H5 t/ T# L4 Y" e
// take no (simulated) time. The M(foo) means "The message- a" T# B( u& ~7 k
// called <foo>". You can send a message To a particular# ?0 g4 j6 W' ^* K% S
// object, or ForEach object in a collection.
4 Y- Q2 q' r1 Z+ n
7 y" s" `% d( N' M( V: f- l // Note we update the heatspace in two phases: first run
5 j/ Z+ A4 ^. K3 U" s9 @ // diffusion, then run "updateWorld" to actually enact the# f5 A& x8 b: B$ Q8 L; S
// changes the heatbugs have made. The ordering here is l" |( k0 ^$ E8 t. k
// significant!
- z7 ] w9 j: R. X I q' c+ n6 d& x8 `; R 3 Q% S2 X% \8 A: N0 I$ `! @9 ]
// Note also, that with the additional
7 T' e8 ^0 {# W // `randomizeHeatbugUpdateOrder' Boolean flag we can6 w) i) k2 \# c& B7 _" S
// randomize the order in which the bugs actually run
2 V* `1 s7 M4 H e' U8 S6 o // their step rule. This has the effect of removing any
1 ^' Y& M' x0 u. B // systematic bias in the iteration throught the heatbug
- H- b3 E C' w+ K // list from timestep to timestep
* J" Y9 h! M3 W; h) ^
5 v' B: ]; P4 _" y, h( E" `) l // By default, all `createActionForEach' modelActions have
3 O& j& r+ `- t; b- E* L // a default order of `Sequential', which means that the
8 @2 o9 _: @* D4 }- w% ?5 p% z8 ?8 ^ // order of iteration through the `heatbugList' will be
' o2 a% ^1 `" G j // identical (assuming the list order is not changed
1 ^$ n% `+ \; e6 Y // indirectly by some other process).
9 h' s6 J4 X$ ^3 |6 l% ~5 N B9 U
" B$ a( Y8 Y4 a P2 r modelActions = new ActionGroupImpl (getZone ());
* K! D3 f S8 ]. ^0 s
" k* I6 o# ]3 d# ?' A try {. n' D$ O4 X3 p0 X: T* H9 W
modelActions.createActionTo$message
' Z; f8 N. K) i, K- K (heat, new Selector (heat.getClass (), "stepRule", false));! [0 {; n$ D, H- z" [( w3 i8 A
} catch (Exception e) {" O7 J$ `' o) x; j7 Z
System.err.println ("Exception stepRule: " + e.getMessage ());
& M& N3 B# H# p6 }5 Z( D2 N' Z }
O, |, D( q! o+ t2 P7 p1 m% P& W* l% R9 J; v/ w* d' O% G* q
try {5 r0 B8 E- A5 B1 V* F( e
Heatbug proto = (Heatbug) heatbugList.get (0);: g# s/ e) z# q; m: t9 |7 q
Selector sel =
" \ J6 E1 `8 W* u. m" _ new Selector (proto.getClass (), "heatbugStep", false);) E$ r/ M: p' Z
actionForEach =
0 j. r/ }. d! [! k! z' c modelActions.createFActionForEachHomogeneous$call: R( g6 ]1 u: b" }( g
(heatbugList,
+ Z( Y1 m( \0 \4 j' Y new FCallImpl (this, proto, sel,
v5 W# ?$ |" f! l8 Q new FArgumentsImpl (this, sel)));
4 y# h% `# N8 v% g. w! _ } catch (Exception e) {
: e$ H+ a+ y; N8 @, G/ y, Q e.printStackTrace (System.err);8 m" ^/ h- e5 L, N
}
4 d5 P5 k4 K$ t' x6 c4 e ) e4 b* I, P( Z3 V* `
syncUpdateOrder ();
2 _$ P7 h6 F- h. p2 i& j& w9 A, j4 Q6 }+ J' ]/ I
try {
8 C9 ^3 ^7 u( d, e! ]+ u; n1 N modelActions.createActionTo$message
1 J7 r* P1 V6 a' E* a0 ] (heat, new Selector (heat.getClass (), "updateLattice", false));
) x4 H0 a4 b& l/ g% A } catch (Exception e) {
# W. G: K$ {: Y0 g/ z$ `' v, ^0 t System.err.println("Exception updateLattice: " + e.getMessage ());2 o9 Y0 I w. {% \: c S3 y
}
( A! H* \3 j- @& x3 T9 g ( m. e/ h% E! z
// Then we create a schedule that executes the
7 M9 `/ l# d( I, V! _7 ` @ // modelActions. modelActions is an ActionGroup, by itself it4 w" o' Q+ d* R; n! n8 u
// has no notion of time. In order to have it executed in
- j8 g6 |4 C1 T; v6 Q K5 k // time, we create a Schedule that says to use the
* a# E T8 e4 B3 O! t, | // modelActions ActionGroup at particular times. This
) K# m. s; T, X' T# S P2 \$ a // schedule has a repeat interval of 1, it will loop every
+ t1 _2 X2 s& d0 ]" P // time step. The action is executed at time 0 relative to
6 z% r) q e: C7 { // the beginning of the loop.* V6 @* Q S! {
* s8 v/ z4 q3 c* l {
// This is a simple schedule, with only one action that is4 `3 O2 d1 g$ [6 Z7 n7 `! j0 }
// just repeated every time. See jmousetrap for more! B6 a8 A6 _6 @, T
// complicated schedules.
% C9 J0 q( K5 R+ s1 X2 ?
6 j6 b& P. h N' v& t g modelSchedule = new ScheduleImpl (getZone (), 1);6 x0 n2 s9 Z, l3 {% T1 E3 v& J+ c
modelSchedule.at$createAction (0, modelActions);
' L' h# C: B, I: o: E 0 g* x4 M- f. @
return this;& {! ?' p+ C8 u x4 h. y! I
} |