HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
+ ^7 |8 m$ J/ W+ Y M
) O1 l9 _5 }6 ?! Q, V/ z public Object buildActions () {
( T: m" H u: T, `$ g0 T super.buildActions();
- b0 |$ x9 {/ [! q0 z3 b % u1 }, y$ ^$ ?+ e
// Create the list of simulation actions. We put these in
. f- D# f2 f) ]) Y6 C* F // an action group, because we want these actions to be, v, E8 ?- ~1 \3 C
// executed in a specific order, but these steps should" Z8 C2 r8 a! P+ ^+ q
// take no (simulated) time. The M(foo) means "The message
5 y8 J# C6 Y& m' e3 ]! H // called <foo>". You can send a message To a particular1 m" X+ P' \" C. f) N3 N
// object, or ForEach object in a collection.
) O: x* j$ j( L' e9 ?
& O; I. R7 H9 N; J // Note we update the heatspace in two phases: first run# V% l0 z+ T3 e8 V5 N. I+ z( m
// diffusion, then run "updateWorld" to actually enact the
# R/ R( q) H+ b2 L7 V" A! L( I! L% L // changes the heatbugs have made. The ordering here is
# _ ]. w* W$ Q. G% E1 E // significant!
3 `, Q2 N) T' e, Q4 B4 a; d & V( X# M0 U( v5 l1 R7 Q
// Note also, that with the additional
/ G0 ^5 ^/ D% V8 a // `randomizeHeatbugUpdateOrder' Boolean flag we can
3 t: \( ~8 o4 S; l% e // randomize the order in which the bugs actually run3 F( M( d, c6 f4 Y
// their step rule. This has the effect of removing any
2 r3 f& w4 Z& Y3 f: s5 L, o // systematic bias in the iteration throught the heatbug1 d: @, @9 q+ p1 ?& o
// list from timestep to timestep
4 Y6 \6 ~9 U9 v' h" E
s3 x& t% R3 g$ y3 C // By default, all `createActionForEach' modelActions have
* C" J2 q; @3 k! X; ^* |' a2 j // a default order of `Sequential', which means that the
4 X1 s9 ^& p# `7 U. ` // order of iteration through the `heatbugList' will be
. m( U4 M: b; p // identical (assuming the list order is not changed
2 h$ v, T2 i+ A5 K2 U // indirectly by some other process).
n0 q: r3 q2 K! h8 L, u4 S! P7 { * f' G) C: a' G$ }) A0 R' a' R
modelActions = new ActionGroupImpl (getZone ());
3 O; S# _+ [- [ _, W- E: N$ j' |, R% J( _% O
try {
% W8 u$ F! I o# _# ` modelActions.createActionTo$message
4 Z+ v. R; Y8 f5 A. k (heat, new Selector (heat.getClass (), "stepRule", false));* n& ?9 b* i% T$ [8 B
} catch (Exception e) {9 r# s0 W. G' |+ j; b3 n
System.err.println ("Exception stepRule: " + e.getMessage ());
: X: ~" M' C6 o2 f }
|# G. @8 u4 B- `; O+ G o1 N6 }7 e# I" l: e8 `( d
try {
% ~$ [4 |3 A8 e: b+ P* q% @ Heatbug proto = (Heatbug) heatbugList.get (0);2 w% H' T: g" K$ O# u/ h5 |
Selector sel =
2 p" K; `; d: E/ a; O$ J, |) R; ] new Selector (proto.getClass (), "heatbugStep", false);$ x: Q. T( h5 H; j
actionForEach =
, R1 u& t5 J# u modelActions.createFActionForEachHomogeneous$call
2 N. k+ h T p. @: E: h (heatbugList,& F+ {$ S# ~- E. k, j6 O* e
new FCallImpl (this, proto, sel,: ?8 x4 W9 U8 w
new FArgumentsImpl (this, sel)));) [2 T: I i2 Q& c, p
} catch (Exception e) {
) @+ n% k$ O h# O% }) w# f2 X \ e.printStackTrace (System.err);
V- C# c6 v6 X( }: x$ h l P0 w }5 T5 @1 G S0 V3 g
; \8 M3 A; t; n: ^6 O7 Q2 h/ a syncUpdateOrder ();
( y; H; r# v. Q8 O N; E$ X% _* g J2 h2 R
try {7 T2 c* r" X# h7 t6 ?$ @
modelActions.createActionTo$message
5 B; T6 H4 B) P+ a- C (heat, new Selector (heat.getClass (), "updateLattice", false));) ^8 U: S+ k( Y
} catch (Exception e) {& z6 U0 U2 o {) K: h# c X+ k- J# h
System.err.println("Exception updateLattice: " + e.getMessage ());
* j9 M H. G, W0 J } k2 ]' L; G' U6 ]
1 P/ x4 J. N' F+ r5 R* |3 U // Then we create a schedule that executes the+ }: C: i4 X* C2 ^
// modelActions. modelActions is an ActionGroup, by itself it
2 ^; p+ E( \4 t$ f5 q2 D // has no notion of time. In order to have it executed in W# c' d5 v5 W. ]! n/ c) o9 G/ y
// time, we create a Schedule that says to use the
1 s2 I) d/ P" a* w) G' C0 p // modelActions ActionGroup at particular times. This
& I' u5 @8 T( b7 @ l, C% {( |& }5 T8 A // schedule has a repeat interval of 1, it will loop every2 ?6 a0 O* z' m0 [' N
// time step. The action is executed at time 0 relative to4 W4 |/ q1 k1 i$ q
// the beginning of the loop.
* E9 D5 Y5 d5 _8 E9 q2 H/ G% x7 o" Z4 e0 _4 `3 d7 p0 L
// This is a simple schedule, with only one action that is" X& j# \# t# s# ~7 R
// just repeated every time. See jmousetrap for more7 @7 ]9 T/ C$ A5 k0 K$ g
// complicated schedules.3 t* x0 V. U' T7 g5 Z
% U/ X- e) `% }3 x! m" Z" w& `& r. Q
modelSchedule = new ScheduleImpl (getZone (), 1);
8 |) ?4 k, L# {$ F* D' q4 b modelSchedule.at$createAction (0, modelActions);8 O2 K; I8 I, j a7 W' z! O) R
7 l& U+ S+ N, l; N& Z2 e7 W return this;: u+ u; n r4 [3 n# E
} |