HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
) p5 @1 \7 @& U/ a+ V9 P& J( x: x1 k9 \1 O1 n! a$ u
public Object buildActions () {8 m" ?# ]/ ?% {' h% E
super.buildActions();
. X; N. `# r! S4 o# s$ x% s8 `. B
" l% U3 c% l% Y0 {: A // Create the list of simulation actions. We put these in4 ], B2 H! U) K! p
// an action group, because we want these actions to be
+ O: g: M2 A( x# K // executed in a specific order, but these steps should7 g9 b4 H/ b& E- y, j) }, G2 P* z
// take no (simulated) time. The M(foo) means "The message+ ?* m2 U+ w% k' \( a- l3 f- H* A
// called <foo>". You can send a message To a particular
% c* X+ s# C! B: G: z( B // object, or ForEach object in a collection.
2 |* J. y L/ S+ ^/ T7 s5 i0 ^$ ^ 7 `% e: ]7 g6 N( Y5 p, F
// Note we update the heatspace in two phases: first run
+ X ?1 S5 x$ G // diffusion, then run "updateWorld" to actually enact the# @0 N! `$ I6 d; P" z
// changes the heatbugs have made. The ordering here is
, Z+ ]1 Y( R( |! B+ q. N" H // significant!9 q# N- m1 H/ `6 |
. N# _6 o' O5 a* a) y
// Note also, that with the additional
3 ]7 ^ K! K7 F. A* M8 \! M G. X, \ // `randomizeHeatbugUpdateOrder' Boolean flag we can( @6 f' ~& p' C1 v! V" t. a
// randomize the order in which the bugs actually run
: \6 p! j$ R8 e; N // their step rule. This has the effect of removing any
" `. {/ U1 R o& G% d // systematic bias in the iteration throught the heatbug: u# H. t) l5 i5 p$ J
// list from timestep to timestep. x9 K. Y' u; ~9 G% i
8 s% g1 [% K4 y& c* w5 k5 ?* [8 w( Z
// By default, all `createActionForEach' modelActions have2 H7 m# y, J1 z$ \' P; Z
// a default order of `Sequential', which means that the; t$ ]# x4 i+ n2 j0 k }, [6 Y& P6 A
// order of iteration through the `heatbugList' will be
8 T" ]6 E+ O8 O* q/ m // identical (assuming the list order is not changed% W. q8 E; I) y- _6 `) V0 d
// indirectly by some other process).+ @) t/ _) m) v& u) O
8 E+ u1 i$ a0 ?2 s$ _ modelActions = new ActionGroupImpl (getZone ());
' p* d2 \6 D8 k; J2 t* w; ^+ @# \8 S3 |! S
try {
5 O! c( J0 b$ n) |# n; M5 M; _ modelActions.createActionTo$message3 I/ T" m9 K! W2 [
(heat, new Selector (heat.getClass (), "stepRule", false));, L! j) }0 e* T6 Y9 P
} catch (Exception e) {/ n4 [6 d+ |5 m K% C. m/ d
System.err.println ("Exception stepRule: " + e.getMessage ());# o _: E* l8 u5 F! B1 [
}
, ]9 |5 c' J! e9 E: {& K# ]7 c$ O7 f, K! i' L: `2 a6 g
try {+ w1 H8 P h F8 N, J! v; g% O
Heatbug proto = (Heatbug) heatbugList.get (0);
$ i [% K9 i: _4 x4 Z: { Selector sel =
2 `1 v$ k0 G$ c+ Y& U4 t; Q new Selector (proto.getClass (), "heatbugStep", false);
/ c: \/ B+ M C actionForEach =. |, m2 K3 o% E* f. t* |* C
modelActions.createFActionForEachHomogeneous$call, q J+ P0 T0 e
(heatbugList,' @2 ]/ l' m) ?( l9 X$ D" A0 @7 n5 ~: B' x
new FCallImpl (this, proto, sel,8 K, M3 }% b% M. I( T
new FArgumentsImpl (this, sel)));
: l' J6 Q9 y+ C, A% U+ ~ } catch (Exception e) {
6 J* Y+ ~9 r0 v9 {) O3 \1 [6 I e.printStackTrace (System.err);: G0 a3 `6 o! y* Q+ [7 \( ~* d
}: k9 M7 a* H: d7 R3 l$ g
* w; ]# R+ B, N; Y4 h* N: R syncUpdateOrder ();
" }1 L8 q" G& G& a5 q3 Q) o4 y" e% U; q
try {
* X6 e( X8 \/ [% T2 f modelActions.createActionTo$message + T" f; r. \% M9 z: X, d1 o
(heat, new Selector (heat.getClass (), "updateLattice", false));7 T9 \8 p, h$ b) B+ I
} catch (Exception e) {
5 b' M; e; x& C System.err.println("Exception updateLattice: " + e.getMessage ());
- [$ d( C2 v1 v8 a8 n }
! g, q; Q* W, E+ T0 h5 t: X5 [, z9 t $ h- ^/ k3 e& D
// Then we create a schedule that executes the& `* ~ s3 Y) C4 M! o
// modelActions. modelActions is an ActionGroup, by itself it
- Y8 u9 n8 P+ u2 S( C // has no notion of time. In order to have it executed in
+ e0 |3 H9 q( W6 [5 Q* [! \ // time, we create a Schedule that says to use the' F! { X2 Y6 \0 b
// modelActions ActionGroup at particular times. This9 O8 g2 h5 z% O5 K# S" \# N4 o
// schedule has a repeat interval of 1, it will loop every
' G# T1 j) z7 q // time step. The action is executed at time 0 relative to& X% u t( S0 K+ \5 Z9 X
// the beginning of the loop.2 ^$ Q/ ]2 Z% s! f: P# R
* G* W% m2 O6 e" `, B0 X
// This is a simple schedule, with only one action that is
1 C1 F6 @$ ^# S& s( R2 v$ \( y# _ // just repeated every time. See jmousetrap for more! ~( }- U8 u* v4 d
// complicated schedules.
. b! ?/ w2 \$ o) `- Y + b' u* R% T0 k: \0 G6 |% a
modelSchedule = new ScheduleImpl (getZone (), 1);2 z1 R s9 D6 r# G1 E& K$ Z+ x1 V1 Y
modelSchedule.at$createAction (0, modelActions);
+ @( V* L9 A1 _( H7 c V( \% F- W! O5 H* V& ^+ o) g$ w
return this;
2 O3 a8 M, M/ \ l3 e* v# l! N3 P } |