HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
7 p& e' C: r1 e3 C) F6 \
) H* I" h1 F7 ? public Object buildActions () {% h# i' }* L5 o2 a
super.buildActions();! f; O* [% t; z r5 i1 N3 J2 F
5 S0 @/ }2 G( n. I a8 h6 W1 d) T) J
// Create the list of simulation actions. We put these in
& p7 A S' N' i" C) }" | // an action group, because we want these actions to be
. G* b3 {; a3 E% i1 o! b+ k // executed in a specific order, but these steps should* d) a- a7 S6 }" X$ D' F% A
// take no (simulated) time. The M(foo) means "The message
' Y2 [" X3 a3 b6 x; K // called <foo>". You can send a message To a particular2 f2 W0 T" Q4 @2 y" L
// object, or ForEach object in a collection.
$ N, [( H6 }9 u 0 W& r/ {! x0 q5 i7 J% P! _# ^* p
// Note we update the heatspace in two phases: first run
. @+ k$ Y! e5 L* I8 S; z) N, W // diffusion, then run "updateWorld" to actually enact the9 R! `- ]: ]; w" _6 j" T
// changes the heatbugs have made. The ordering here is% y% ~- m3 |& ?; A9 R" U& i) n
// significant!
6 A4 b' d, i& A( X6 c7 j, Q* L 1 i5 D0 h+ u0 J8 Q
// Note also, that with the additional
/ k" m$ ~) I5 u% R // `randomizeHeatbugUpdateOrder' Boolean flag we can) {' @% L! M! {: Y6 v
// randomize the order in which the bugs actually run- O- w0 Y' \. y) C
// their step rule. This has the effect of removing any
: M8 C6 Z9 p8 q6 f6 _ // systematic bias in the iteration throught the heatbug
0 T; d$ ^/ ?8 {5 b, P: e$ E6 h // list from timestep to timestep* t/ t6 P; F; g2 U x$ [7 ?
' i4 b1 Y' B% h) u! P' A$ z B
// By default, all `createActionForEach' modelActions have$ g% y X8 k1 r
// a default order of `Sequential', which means that the
! d2 d' [- P# } // order of iteration through the `heatbugList' will be0 I5 p! i4 Y, a r: Q! W9 a
// identical (assuming the list order is not changed' {4 w8 Y: S9 S+ s) K. @ \
// indirectly by some other process).' A4 J/ [' e: S) h; O5 N
* ]/ s2 e( O. P. m% |& Z modelActions = new ActionGroupImpl (getZone ());' N, d, ^% v! Z( D, Q7 j5 y: B
P, i$ M5 J8 j try {8 Q( \" L! y( m* ^2 M o
modelActions.createActionTo$message
0 n+ {4 G! f6 _& ?/ ^ (heat, new Selector (heat.getClass (), "stepRule", false));
8 Y9 s9 p7 l7 e, ?/ H+ n } catch (Exception e) {* z: Y3 ?9 {! H8 N/ |9 W
System.err.println ("Exception stepRule: " + e.getMessage ());
- f5 |0 m: Q5 L0 Y }" {$ a' F9 U0 D9 y% y4 O7 @
. G' A i# e- }. R' Z' D4 f try {5 E- a$ y8 n j
Heatbug proto = (Heatbug) heatbugList.get (0);
+ [5 B# x4 @; e, u/ Q4 S Selector sel =
2 R P" F' c8 K2 e$ s& k new Selector (proto.getClass (), "heatbugStep", false);* }7 x# ^- E8 o7 E- z0 y
actionForEach =
' ?# k/ Q- O6 J8 o+ t modelActions.createFActionForEachHomogeneous$call
- C0 _; p: y& ]' K8 X (heatbugList,. Q5 l, N5 o' v! c/ L) S, F
new FCallImpl (this, proto, sel,$ K, Y- v: y6 \; Q% {
new FArgumentsImpl (this, sel)));8 C& R. L2 s7 c# j
} catch (Exception e) {
( q5 S4 Y! a' _2 j- v* C e.printStackTrace (System.err);
2 B) s0 L2 g& b9 ^+ B }: @. V& i1 K9 R+ m. W+ w
T- \: X* p( k3 q syncUpdateOrder ();
, b/ a1 q- l' q+ I$ k
6 j# m+ r2 H* m+ Q0 X8 n, g$ i Z try {$ e8 f1 D$ ]6 Q6 n2 b5 f; o P
modelActions.createActionTo$message * ? c8 i5 m) e) i+ r; N0 h* }
(heat, new Selector (heat.getClass (), "updateLattice", false));
% L1 I+ L6 Q2 ~! t& L- O } catch (Exception e) {! W! @4 h$ ?! b w; e
System.err.println("Exception updateLattice: " + e.getMessage ());5 h+ N& ?, h$ X) Z
}
6 D$ l4 c0 F, I! d
+ q, f2 v. R- K' |. { // Then we create a schedule that executes the2 [! ~, w6 }5 O
// modelActions. modelActions is an ActionGroup, by itself it
\1 T2 ^% t1 @. w // has no notion of time. In order to have it executed in
& |, d3 x. b K' W9 g1 N // time, we create a Schedule that says to use the/ k! o; i5 q% J$ f" t' u
// modelActions ActionGroup at particular times. This2 @- U0 k: f! f8 Z1 L7 M# v$ h& \ u
// schedule has a repeat interval of 1, it will loop every* l! J* o5 I6 {- A% q
// time step. The action is executed at time 0 relative to
. r( m1 z& R0 z2 ?3 Z/ Y // the beginning of the loop.
- r( q- ]( V0 I; ]
; b& F `$ o& p6 D! a // This is a simple schedule, with only one action that is* l; g5 {0 G% a/ C8 i# n
// just repeated every time. See jmousetrap for more
0 p9 J" \# D0 N // complicated schedules.: h" y$ @) q, `% g+ u
- `8 r2 Y+ B% g4 }/ V. b; l# ~ modelSchedule = new ScheduleImpl (getZone (), 1);
. @4 _5 f( z! J5 M6 b modelSchedule.at$createAction (0, modelActions);5 [; q# W& T B* d' Q
! f1 T$ y, W1 w4 y2 _3 V1 I6 F return this;" @( P( Z2 Z |. s
} |