HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:: ~) r. r% V5 }, F& a# m I3 e
' U ^6 h& K: G8 {+ Q1 }3 R public Object buildActions () {' e. s8 ^7 x: O3 Z
super.buildActions();
% u0 t8 e/ X, d* u 5 E3 T) q/ |! R# |
// Create the list of simulation actions. We put these in
8 [( H& a2 f# r: I2 U3 s+ R // an action group, because we want these actions to be
1 j* k2 _" R+ M" s- h // executed in a specific order, but these steps should
, J) K2 {/ X' @3 Z3 I6 [$ t0 [ // take no (simulated) time. The M(foo) means "The message
* z: @* Y1 h) X r$ i6 V0 { // called <foo>". You can send a message To a particular5 f$ k5 Z* M) L ]. X0 v
// object, or ForEach object in a collection.- [# |" G8 b! R8 D
2 I X6 ?' {, T0 ^
// Note we update the heatspace in two phases: first run' f' p+ c3 t; _# |) j E* _
// diffusion, then run "updateWorld" to actually enact the
+ P L) p( j( K6 w // changes the heatbugs have made. The ordering here is) Q" y5 Y& P, _2 A8 h! ^# ?9 v
// significant!
0 }) F: q; n+ R3 {9 X/ H( C/ o% l # r) c% s/ \0 N- E b
// Note also, that with the additional! e3 c8 @$ ]- }7 A6 l5 }
// `randomizeHeatbugUpdateOrder' Boolean flag we can/ |* z$ w& y1 j! L Y
// randomize the order in which the bugs actually run% o8 E1 L5 {4 u) P5 l: T# R
// their step rule. This has the effect of removing any: Y; ^, H" ^+ _6 [, W3 U$ l
// systematic bias in the iteration throught the heatbug2 d& k& w& S3 g' [2 H" e/ k
// list from timestep to timestep
3 e8 {* @: u5 o* z) `; |
+ f4 q* x6 ?. X; E // By default, all `createActionForEach' modelActions have0 I, m9 |! M; o Q1 h6 t
// a default order of `Sequential', which means that the$ R/ p# {) |' b; y" M3 B, R
// order of iteration through the `heatbugList' will be' A( h: ?. _3 V% [$ @
// identical (assuming the list order is not changed
% k3 k! E( r0 b7 p1 A* ~ // indirectly by some other process).! j& X @& V3 f6 r* \& @
3 K4 v0 Y% X2 `$ @ D0 u3 n modelActions = new ActionGroupImpl (getZone ());
) Z5 k! G4 ]8 {+ }) c; l# P) r! c. b/ p, K' k; ]
try {. _$ o0 i) C7 k
modelActions.createActionTo$message
7 S' k6 V, x( q8 q Y8 W (heat, new Selector (heat.getClass (), "stepRule", false));
6 s- _# K7 e# e# p B6 ` w } catch (Exception e) {
- n6 A. R+ L) m' X" ^ System.err.println ("Exception stepRule: " + e.getMessage ());- v$ z2 y& r3 l: b) R
}+ k3 v" M7 @- }) k- q
4 i3 [1 R- w3 p2 Y try {2 g- F9 L) v m9 h* K
Heatbug proto = (Heatbug) heatbugList.get (0);) X$ d5 p" [0 n, X1 B! d
Selector sel = . Y1 ^- m! t) }* o/ U+ k: w; H
new Selector (proto.getClass (), "heatbugStep", false);
1 A. Z; i( M8 V' p actionForEach =
9 c5 n$ C/ s( @5 p& j. f% @ modelActions.createFActionForEachHomogeneous$call
# f1 m9 H7 l' Q: i. o (heatbugList,5 Y6 q5 o; X' P d/ s' ^
new FCallImpl (this, proto, sel,
& p. Z5 b3 H( A2 r new FArgumentsImpl (this, sel)));
3 T! z3 D7 Q+ O+ h+ d( r/ H } catch (Exception e) {5 U. ]9 ^$ ]( _+ s- D+ h; W
e.printStackTrace (System.err);9 c2 k# E- R7 C0 _: M" c: b
}- w% F5 a, B' f/ \7 c6 B
8 @ U' H2 N, | syncUpdateOrder ();+ _9 F! |+ m6 f* Z
- d8 Z1 o E( Y" u. O try {
% p0 C! Q4 A+ N6 @. ^1 y modelActions.createActionTo$message
3 P3 l# A* b0 m4 j7 ^( M5 m/ f (heat, new Selector (heat.getClass (), "updateLattice", false));4 L3 H6 n0 V+ J6 n
} catch (Exception e) {
* l* L& c$ Q% L+ @ System.err.println("Exception updateLattice: " + e.getMessage ());
$ M) i- L' p* X9 ~ }+ f7 ]4 c% D: U3 E' k9 F+ W0 Y
4 z+ o7 A6 q+ a2 p6 F ^1 F+ A // Then we create a schedule that executes the
3 }- d- K7 H/ Q3 z6 b: T: ?5 r // modelActions. modelActions is an ActionGroup, by itself it
9 V2 ~8 X% ], }( N. w" ^* J# R$ j6 } // has no notion of time. In order to have it executed in
' U8 J I7 [* r" X! n // time, we create a Schedule that says to use the2 m/ P `4 L& |9 x1 z$ H; y
// modelActions ActionGroup at particular times. This3 x) Z! C6 b8 h+ }5 k& Y7 y
// schedule has a repeat interval of 1, it will loop every( n! j+ |" V/ S
// time step. The action is executed at time 0 relative to; z+ D! X. M& v! _
// the beginning of the loop.
( |6 |% ^7 p9 R5 x2 A. Q/ ?; X+ l' y5 X6 b1 A9 [( W
// This is a simple schedule, with only one action that is
1 _$ ~, ^% C e4 T1 C# A3 I // just repeated every time. See jmousetrap for more! F; [. ^: n8 c1 C6 Z a+ I+ a
// complicated schedules.8 Q ^. z9 P+ |9 a
# A+ K, |" K" |: l& c- L( L; C
modelSchedule = new ScheduleImpl (getZone (), 1);- u% f' Z. v8 Z; h7 i6 R
modelSchedule.at$createAction (0, modelActions);1 ^2 M$ s1 ~6 [
( x* _: H0 o# J
return this;2 x& ]2 P B# }8 ?: t
} |