HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
- k# R, g' T! c4 t* M' D W
; E! ~6 [" H) u& J3 w9 q U public Object buildActions () {6 p2 w3 g% `& z% |* \
super.buildActions();
; }; d& D# p { + B9 x ?& U1 M6 z/ R+ H$ K6 j$ ]" Q
// Create the list of simulation actions. We put these in
4 I8 e2 Y* U: e; W* J0 N3 f) }" @ // an action group, because we want these actions to be F4 E9 \, h' |" _* j
// executed in a specific order, but these steps should
3 L' F- Z6 M& o4 A, Y3 y) h // take no (simulated) time. The M(foo) means "The message4 `) T% d: T8 o, I7 h2 Y
// called <foo>". You can send a message To a particular
: Y7 V6 Y4 T% I m8 i" d7 @8 S // object, or ForEach object in a collection.$ m: `: t/ H. ~. h8 U' }- x
- b% v6 |2 B8 |! `# X9 C& W
// Note we update the heatspace in two phases: first run5 R; |) w2 G" }/ O; ?- G- S
// diffusion, then run "updateWorld" to actually enact the1 |. a* @' D& H# c' D
// changes the heatbugs have made. The ordering here is6 A. L: r$ S1 e2 e0 n% N+ ]/ K. J
// significant!
# V8 f C/ G* R' }% i% ~/ U5 o. g
6 c$ b d, Z0 z( x% ] // Note also, that with the additional
: Y5 j/ V7 Q& G& k // `randomizeHeatbugUpdateOrder' Boolean flag we can. {. L: d3 h( x6 \' Z4 q
// randomize the order in which the bugs actually run
: ]8 Q j% K) l6 u& q/ f: W // their step rule. This has the effect of removing any
% Q ]5 K+ B) q$ Y# Z/ p, r // systematic bias in the iteration throught the heatbug
* l: m# P1 L( P; m. Z R+ g7 W& P // list from timestep to timestep
0 R0 H! O/ k/ }# `9 i: H2 D6 R8 \- s& r 3 w# M+ h! \* |2 |2 @$ B$ K6 m
// By default, all `createActionForEach' modelActions have
& a: |2 R+ N' h4 k4 _ // a default order of `Sequential', which means that the
/ g0 d: w$ J0 U$ @- C) c // order of iteration through the `heatbugList' will be
+ w* ]. z X4 g0 i; c // identical (assuming the list order is not changed
% s# F: M+ W w6 n# b" D' E/ o // indirectly by some other process).) h2 S. W5 y. l
' ^$ J7 ~; A9 r1 g modelActions = new ActionGroupImpl (getZone ());
* t" {2 j; ^3 a3 s, ?- D% p7 K) R4 P c5 T! v
try {
" l5 |9 f8 E( G1 ^' ^3 _7 L modelActions.createActionTo$message
* T4 [* S5 L. y (heat, new Selector (heat.getClass (), "stepRule", false));" Q. I/ g+ W2 }6 N+ r. r# v, W
} catch (Exception e) {
7 D. X) a+ ^3 H+ [% U" v( @0 ?& B System.err.println ("Exception stepRule: " + e.getMessage ());
. u1 |# F K" M' E }7 O, m8 S7 r' B+ E z# o
" Q. b& C$ z- L
try {
' }' Y$ k4 k( z Heatbug proto = (Heatbug) heatbugList.get (0);
" T8 C9 y- C# M5 }# E Selector sel = ( f; {2 y3 l) G! W( F# t/ o, C
new Selector (proto.getClass (), "heatbugStep", false);: _ k% p8 \1 O6 E# O" a P
actionForEach =
, a# i5 C6 z4 o' q: e modelActions.createFActionForEachHomogeneous$call
! O0 n$ k! N! j$ G) }% x8 l. N (heatbugList,
$ f N" H' h. X8 Q. L" P new FCallImpl (this, proto, sel,
" a! {) l- E5 s* l2 l6 q new FArgumentsImpl (this, sel)));; |8 @5 y: C8 X+ E
} catch (Exception e) {
7 l6 c1 F: C' D: i0 }5 p e.printStackTrace (System.err);' P; y, V& D+ v- U/ O$ Y
}
/ X; \( i7 ^) G1 b# d" d' M- a
& U# E3 V6 {- M% `7 C- q7 j syncUpdateOrder (); U7 n8 Y/ Y. z* a/ b" X0 a* q g6 F! R
& }2 z& p! r/ V0 g3 N+ Y/ ] try {
' ~" h% U7 p% k# r1 G+ b2 j. n& ~ modelActions.createActionTo$message ! k. k9 c/ \" Q7 U1 k& `1 h
(heat, new Selector (heat.getClass (), "updateLattice", false));# B2 C6 T3 T6 u" ?. Q
} catch (Exception e) {
0 H# B* t% j. r i: u System.err.println("Exception updateLattice: " + e.getMessage ());
, [; G% z/ _) V2 g }5 i; [5 j% v$ L. l& F! y
% n7 N$ r# X" U2 O- K, b- x
// Then we create a schedule that executes the/ O S' \. _3 o8 W
// modelActions. modelActions is an ActionGroup, by itself it
9 S0 O, h1 S8 x // has no notion of time. In order to have it executed in9 q9 D, F% G! K; U; P& j
// time, we create a Schedule that says to use the# \4 b" M0 u3 j! l
// modelActions ActionGroup at particular times. This
8 h! R- M& G4 \9 z; q // schedule has a repeat interval of 1, it will loop every w7 ]. X+ J7 |5 J
// time step. The action is executed at time 0 relative to' T* N! |( z. h/ R _, G: E
// the beginning of the loop.' n) h7 a1 o' G) B; F
- X. ^- M/ A6 E
// This is a simple schedule, with only one action that is
* P* l( ^6 h0 a) r- K // just repeated every time. See jmousetrap for more, ~! }/ G% p" ]/ L/ Q
// complicated schedules.
' ~3 ^5 f$ w. A& B9 S0 b1 i$ B 0 Y v- {- [8 U4 J) N4 V
modelSchedule = new ScheduleImpl (getZone (), 1);1 g; m0 \$ B% U' [6 v# `+ W
modelSchedule.at$createAction (0, modelActions);
0 I8 l0 r9 P3 @' w3 r
% g# P! C* n- M return this;
- o: q2 B7 z% x: m# R } |