HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:( o: W6 y2 b8 U
( n) E: z; o: s% B
public Object buildActions () {
1 R7 U1 a( L( P1 J+ i8 Q/ p+ T/ v& a super.buildActions();
: s$ ^; O# F; q4 f. z# | 5 n9 j) q7 W# l5 X$ D, g
// Create the list of simulation actions. We put these in
% q" ?9 G5 R. r8 W( j8 S // an action group, because we want these actions to be* Y$ f* P: f3 s# _2 `" E
// executed in a specific order, but these steps should+ @6 L+ x' l9 s0 c% k: \
// take no (simulated) time. The M(foo) means "The message
# T$ m3 C3 c2 o1 F- r // called <foo>". You can send a message To a particular
; i9 j3 l2 @2 E9 m" F // object, or ForEach object in a collection.4 c2 Z, B/ j/ @
3 F% P- ?4 r, r' n! u. ? // Note we update the heatspace in two phases: first run
. j* {% C- s7 @( w% u4 U // diffusion, then run "updateWorld" to actually enact the( E& x* F# i2 }: I7 P1 T& k: c
// changes the heatbugs have made. The ordering here is
/ Q% O* S- W& q% V5 B; O4 }; ` // significant!
/ H. }: x4 D, E9 e
; r1 G: v- E' U* y // Note also, that with the additional
& H: `# S9 m) z5 U- A+ _4 { w1 t3 ` // `randomizeHeatbugUpdateOrder' Boolean flag we can. E* M u+ G% I0 _% b
// randomize the order in which the bugs actually run
1 c% u* r8 V7 {6 I; ]/ w4 I/ T // their step rule. This has the effect of removing any
& |4 ?: ?; x, I" v: t9 O // systematic bias in the iteration throught the heatbug2 g& ]* U! R! A: C9 H4 c
// list from timestep to timestep J& y4 ]$ K6 _' c2 m* C
3 L+ a! d0 x! ?7 T( n, \
// By default, all `createActionForEach' modelActions have( S/ p# k3 X; m% J9 ?; ^ \6 _0 L
// a default order of `Sequential', which means that the
+ N. v$ |4 u( U# p" d // order of iteration through the `heatbugList' will be
$ }; f7 s5 s0 J& E5 U; ] // identical (assuming the list order is not changed
X! Q, }! q+ k, ~4 H // indirectly by some other process).
3 G. d+ X4 l' L) K2 }5 |
$ j7 [3 I% N$ A7 d+ {7 v modelActions = new ActionGroupImpl (getZone ());
9 X: b9 N3 ?1 A
6 F/ f, C0 ?! B6 e* o$ J try {5 e. |, u+ p F. w; Q k
modelActions.createActionTo$message; T8 C0 `/ t* }
(heat, new Selector (heat.getClass (), "stepRule", false));! b! I5 }. w, k
} catch (Exception e) {/ {+ n: X+ P7 L5 x1 Y) y
System.err.println ("Exception stepRule: " + e.getMessage ());, p5 _1 E1 |+ U% ~5 u3 U
}4 @& H6 l; G7 N" X2 j
. a& p; [1 T) h' Q' r' @, z' I
try {
4 i5 L9 l+ K) n" @; {# k: d Heatbug proto = (Heatbug) heatbugList.get (0);8 E2 W4 \ ^: a* d
Selector sel = 4 d: E4 J! o0 t- A4 G: }* S7 r
new Selector (proto.getClass (), "heatbugStep", false);
( Q2 {7 M# L& Q1 M6 E- G6 l6 |+ C7 Z actionForEach =' b# _% z; f; _
modelActions.createFActionForEachHomogeneous$call- a% V" _. s0 n7 U; z& q+ p/ E
(heatbugList,) j% {9 d" X* A/ ?6 L: S! a& x
new FCallImpl (this, proto, sel,
) H4 k# z+ g+ m Y. i& t0 H new FArgumentsImpl (this, sel)));
0 O3 v9 ?0 H8 c/ Q8 |! x8 v. W } catch (Exception e) {
3 |& P$ u# t5 a: q: }. G# V e.printStackTrace (System.err);
* _" X3 ] @+ J# T }0 @7 b$ k; b5 [/ g: N
) ?' C# b" M6 s7 X' e
syncUpdateOrder ();
% l% |* u @2 l; S; h9 d& Z1 f/ k4 \
try {7 `1 L1 m- U* V3 w8 ?! X
modelActions.createActionTo$message
/ L% B7 M( I+ ]* z* p% C (heat, new Selector (heat.getClass (), "updateLattice", false));
W) T( B* Y4 R) Q } catch (Exception e) {2 R6 c+ [. j3 J# S4 R; [5 B v4 P
System.err.println("Exception updateLattice: " + e.getMessage ());/ o9 |5 y8 Q/ ~6 A/ t
}/ O% @3 P; Z5 v# ~. k- d
+ ^4 ] H! Z9 w // Then we create a schedule that executes the' p: g( b2 R1 U( K/ E( ] H
// modelActions. modelActions is an ActionGroup, by itself it5 c: l' m, D5 w( V& I- m
// has no notion of time. In order to have it executed in
0 Q6 ~0 x; O$ v P* h // time, we create a Schedule that says to use the
( a: _8 l4 _& C6 w$ u+ F6 C // modelActions ActionGroup at particular times. This* o4 ?$ i2 @7 P0 D% J
// schedule has a repeat interval of 1, it will loop every- T9 a2 F: t/ ]' k; j# x
// time step. The action is executed at time 0 relative to
( U5 p4 u: ~' {: ]- u+ H" ?: \ // the beginning of the loop.$ ]% r% U( |/ {" \( V! j
; m! S9 f, F; e8 ~3 h. A+ C // This is a simple schedule, with only one action that is
% N# ?" ]! x' E* A // just repeated every time. See jmousetrap for more; ]& h4 y' w* x2 Y4 N2 O
// complicated schedules.
0 y R, v: x: _+ }0 @ 0 g |- |) u. `5 Y1 T8 T& O
modelSchedule = new ScheduleImpl (getZone (), 1);
6 C- ^! J2 [4 R$ O' e modelSchedule.at$createAction (0, modelActions);4 Q) h( U4 g x6 e
; u7 X7 z$ D# D5 c9 Q* u0 \ return this;
) h0 T$ C2 S! ` } |