HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:( ]$ w" s, t! j3 M1 p0 ?4 ^! G
0 H- e- j2 ^3 e: l- g public Object buildActions () {
, `( z% ~, u A- ?! [4 t super.buildActions();
. k7 [4 o! B. c* `( t 9 \3 F9 z L. w. f
// Create the list of simulation actions. We put these in- e1 [ s3 {4 N: V% A
// an action group, because we want these actions to be8 K6 I4 h- x2 y0 n: Y/ V. V
// executed in a specific order, but these steps should
, H- M2 N! }. ^9 x6 B4 k // take no (simulated) time. The M(foo) means "The message
" A6 [! ]- a# u+ Q1 [ // called <foo>". You can send a message To a particular& A) w2 u: d/ o8 v6 s9 H6 t- a
// object, or ForEach object in a collection.% |8 e$ p3 L. r" v- ?+ o9 o
! M, h; a* _: E; E5 T, E% m // Note we update the heatspace in two phases: first run9 c, j+ b4 \4 S* T+ m/ g3 X
// diffusion, then run "updateWorld" to actually enact the
, N6 j0 ~1 K" j3 ] // changes the heatbugs have made. The ordering here is
+ \6 W% n+ r0 r; [ // significant!
7 a7 T& l2 _% K* b
0 V9 M& R& c# F& t/ G( ]) v, G- {$ S! U // Note also, that with the additional
5 C/ E& I* A4 v1 z0 X // `randomizeHeatbugUpdateOrder' Boolean flag we can9 G* f% R( t) Y# l- m; Y' `5 H/ d
// randomize the order in which the bugs actually run
% G7 [- ^, g1 u' }% Y3 ` // their step rule. This has the effect of removing any0 ?* j+ c3 }$ v( V1 e7 K
// systematic bias in the iteration throught the heatbug4 V W1 I* c; t: C6 U( t7 @
// list from timestep to timestep
2 h9 _# S1 n6 T' o. c" j
! p) F; c0 M1 M // By default, all `createActionForEach' modelActions have
2 J; X2 H0 V) e& x# y$ z // a default order of `Sequential', which means that the
+ |4 C# I5 B5 ]8 u* F // order of iteration through the `heatbugList' will be% j# q6 {* A+ ]( q5 O
// identical (assuming the list order is not changed" g2 Z5 A4 a- U: j" B4 Z
// indirectly by some other process).
" o7 E3 W, Z. `+ t$ H $ h' y9 X) H0 @% L( r V9 a# `
modelActions = new ActionGroupImpl (getZone ());
3 m* Q# V6 ~7 [( T7 a# v: P" R. l a
try {
7 ]8 A3 H' _9 [* E! G$ {5 u! E modelActions.createActionTo$message
. ?" N4 t% a p( o( k& R (heat, new Selector (heat.getClass (), "stepRule", false));/ o+ d3 @1 y Z& |" ]) M: F
} catch (Exception e) {
9 Q. H7 @. [: P System.err.println ("Exception stepRule: " + e.getMessage ());
- \. A% K: J- D; V }5 M) [9 [* e: K: o2 `( }
0 }; a; ~! d% C O2 c4 D+ n try {+ L+ ^/ _: [' P- T$ c. [6 R, S% t2 s7 d
Heatbug proto = (Heatbug) heatbugList.get (0);8 I9 k7 ?1 q7 ^6 p" ?( l: M" D
Selector sel = 8 C3 P: U/ l+ t/ N
new Selector (proto.getClass (), "heatbugStep", false);
+ X4 v/ \, N; ]; q- L& J+ v p! e) o1 J actionForEach =
; |6 ]" C: J! Y7 s modelActions.createFActionForEachHomogeneous$call
6 \1 x! p* {: b4 a& v5 I( K/ [ (heatbugList,
. e: P9 y0 u: z! J4 s$ u- ~ new FCallImpl (this, proto, sel,# y9 i9 b3 v b' c# e$ z
new FArgumentsImpl (this, sel)));
" x2 s0 O/ p6 E: X+ ^. a% L } catch (Exception e) {
! |* Z& h$ J" B9 W e.printStackTrace (System.err);: ~$ H& `3 J- B N) ]
}1 K9 R$ q. H G: A2 y! x: R
/ n# |5 J6 i, k syncUpdateOrder ();
- C6 W$ A9 n, |9 G6 D( F* u
8 D. }0 O# Q6 h; ?- u try {
* N. N7 P# o- P; p$ K modelActions.createActionTo$message 3 c/ \: }8 {" w }# Y0 f2 B
(heat, new Selector (heat.getClass (), "updateLattice", false));
4 w7 W2 d! I8 X3 G" F } catch (Exception e) {, @/ q) l, Q$ y0 R& @- k
System.err.println("Exception updateLattice: " + e.getMessage ());
4 x! v3 V) L; l# ~ }
9 b" C- x- C9 Q% ~9 u0 r8 F9 [ % h& }6 z9 Y3 Z' ?9 ~
// Then we create a schedule that executes the
' N4 l$ ?6 [( N% D& Z // modelActions. modelActions is an ActionGroup, by itself it
2 T4 F) b: V& b5 b' Y& p // has no notion of time. In order to have it executed in
+ G/ a8 h I* }0 S3 S // time, we create a Schedule that says to use the
& n3 @/ F$ I2 l; E3 A // modelActions ActionGroup at particular times. This% j. C* D; \7 F/ ~, z7 Z4 d) W
// schedule has a repeat interval of 1, it will loop every
! r" j. k" }' P V; O8 \ // time step. The action is executed at time 0 relative to$ g: k( h8 n2 U; x; h" }* U9 J
// the beginning of the loop.
, D! g0 A& |/ l; U! u) P: q3 \# F7 v7 |) M3 v. }0 g5 r
// This is a simple schedule, with only one action that is$ @1 Z/ c. |6 Y o5 b- b/ o
// just repeated every time. See jmousetrap for more
& K* D6 s: i2 N* C0 z ]4 o! J // complicated schedules.9 R; x3 l& g1 O& g
& a" F ]4 q3 j
modelSchedule = new ScheduleImpl (getZone (), 1);
/ Y# x: `4 Y1 A% `5 H1 Q5 _1 A9 h modelSchedule.at$createAction (0, modelActions);4 d m9 a' R: F: Q
7 x) v: w* [1 d( `7 @- }8 i6 q
return this;
c! V' q& I2 a7 P# }. ? } |