HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
9 \! W* S. g+ _
& `0 d4 ]. ^! C public Object buildActions () {
8 D0 K9 U8 v; N super.buildActions();
4 R6 U/ M+ d, v! a: _* L0 Y ' b( ]9 A/ i8 j& l; |8 E% t5 R5 R; C
// Create the list of simulation actions. We put these in
) B+ E$ p$ y, S$ H' @; k // an action group, because we want these actions to be7 o7 M/ F! i: z3 l! @: _, A
// executed in a specific order, but these steps should
4 B) H& ]. p7 T0 Q# f# V8 s // take no (simulated) time. The M(foo) means "The message
4 A8 B3 ?; ^8 x+ B2 l6 n6 O) m( L // called <foo>". You can send a message To a particular
& K6 v. e3 _! @7 F/ I, p$ y' B // object, or ForEach object in a collection.
% I6 X$ n, Q" K$ T+ A' V - X0 u) s! Z* l# \( }1 D9 [
// Note we update the heatspace in two phases: first run
8 J7 i% ^- z- v5 t0 l1 v0 j% J // diffusion, then run "updateWorld" to actually enact the0 b- k v/ ]4 k1 q+ R+ s2 L6 u$ U
// changes the heatbugs have made. The ordering here is
; v0 X; `/ t, G5 ~( o // significant!
: U. J. z8 ]: U" l4 ^
7 J) N1 y3 m4 [4 M c6 y+ k2 D9 B. l1 f // Note also, that with the additional4 { d4 w1 |2 Q- R7 C$ \' n
// `randomizeHeatbugUpdateOrder' Boolean flag we can
8 Q, ~0 |1 k/ E; y: O // randomize the order in which the bugs actually run2 K7 |# V; K9 _- V8 l; q$ Q4 `
// their step rule. This has the effect of removing any
! P; }9 T* U3 s // systematic bias in the iteration throught the heatbug' h* W! T! i. ^
// list from timestep to timestep6 i9 B* M' X6 N, R' B
1 P& U: A" W* N9 |( @
// By default, all `createActionForEach' modelActions have% Q) F6 O. u/ F+ N% D/ E
// a default order of `Sequential', which means that the3 F2 B. R2 u! F
// order of iteration through the `heatbugList' will be
/ z* F; {+ ^8 U0 Z // identical (assuming the list order is not changed
- `' u% n9 ^. G, \% w4 O5 g' F6 j1 Z // indirectly by some other process).
) A n' e6 b4 i& F0 T
% }$ g% y) g$ n4 C modelActions = new ActionGroupImpl (getZone ());
; N2 y- F4 `+ I" I- V/ Z1 t% s5 A
try {0 o: ]6 }# v; ?& v' q' f
modelActions.createActionTo$message" w3 G; Y7 C3 \( k. H Z9 Y& _% q
(heat, new Selector (heat.getClass (), "stepRule", false));
% K& e/ Y& q0 N- `2 X } catch (Exception e) {' g) q" p F+ t
System.err.println ("Exception stepRule: " + e.getMessage ());
8 H" _5 K3 K+ q* w }* T' j- r( U# H, |) ^% [4 m$ v
+ N: x7 Z3 Z. \+ L
try {
) p. ^0 Z4 W( k$ f$ G Heatbug proto = (Heatbug) heatbugList.get (0);' `3 B% ?# D3 j# s5 {
Selector sel =
5 Y4 S h, C- F/ t: A' X; N new Selector (proto.getClass (), "heatbugStep", false);
* Q* Q0 b0 ^& o: s actionForEach =- o' V9 |6 H1 z% {0 I+ {
modelActions.createFActionForEachHomogeneous$call
1 K- K, k+ N5 [, c! B; X9 `/ p6 Y4 T (heatbugList,
% m- z! N9 m# n- K% t, Q+ U8 S new FCallImpl (this, proto, sel,
/ \: D/ h, I# z# m: v F new FArgumentsImpl (this, sel)));9 S0 ^5 w( Y! i8 y- u
} catch (Exception e) {
3 \ R7 h: @. s3 |5 ?' u$ `! b: n e.printStackTrace (System.err);
$ R0 h/ |2 t# ~) X' S$ R( S9 w4 ` }
# E) I% i( ?1 f; M, C & X1 Z0 ^/ ~0 s" x9 k7 K" e
syncUpdateOrder ();
& a6 u5 y; K, j' V# q8 Q
5 g8 m) l, G* ` m try {. p' Y# Z3 `( _: K# ]+ F
modelActions.createActionTo$message % a" t+ r5 ]' {: R2 T7 z
(heat, new Selector (heat.getClass (), "updateLattice", false));) d3 b8 ?4 s. e
} catch (Exception e) {% o, P* v6 x% D. h# B
System.err.println("Exception updateLattice: " + e.getMessage ());* U) r/ p$ s6 n
}; ]" C7 n- b7 ^
" T+ I$ l3 \1 m1 Z) n // Then we create a schedule that executes the2 J# i: g" e) a1 X h
// modelActions. modelActions is an ActionGroup, by itself it' f2 z6 g2 E& q! r0 R* S% R
// has no notion of time. In order to have it executed in3 p" Y! q3 u7 l
// time, we create a Schedule that says to use the; f& V6 ?( K x; E! d
// modelActions ActionGroup at particular times. This9 a+ k& {7 r9 m( k) W
// schedule has a repeat interval of 1, it will loop every7 i) I; E* q& R& \) z7 A
// time step. The action is executed at time 0 relative to' a# P0 ?, U/ y1 \
// the beginning of the loop.+ u; G) ` a6 V: ]; C
0 e( h- M7 a$ d# I // This is a simple schedule, with only one action that is
k* @4 E$ P# ?- y3 X5 A1 Y- s // just repeated every time. See jmousetrap for more& {/ b" H1 h# f& }
// complicated schedules.' B5 y9 @! U. p4 l: w+ q6 u6 m
0 T: P8 _8 ^$ B" J modelSchedule = new ScheduleImpl (getZone (), 1);
3 m. H0 [& P% ]/ ]) D3 \ modelSchedule.at$createAction (0, modelActions);1 H9 y5 D) p! ?5 x7 _
! ]- u; p @4 P1 j return this;
2 n$ u; {3 T) f$ a& k' |, P# I } |