HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:, ~) O# e- {- [0 Q1 D; q
& H H* X" u) |; T8 r8 v! D6 g public Object buildActions () {
* B1 q: }+ X+ L8 D6 N8 a3 }, M" `2 W- ] super.buildActions();2 m9 d% m0 s e8 C( C% M3 u1 y
: ?; H1 v: J+ w9 `4 ^ // Create the list of simulation actions. We put these in
9 O( t r- Q" ?6 [0 v // an action group, because we want these actions to be
( L/ D+ C0 ]" v9 g/ b // executed in a specific order, but these steps should
& h: V" Z! v: }' \3 r2 d/ o // take no (simulated) time. The M(foo) means "The message( S2 J2 p! d/ ~8 E1 W6 k6 ?, n- e
// called <foo>". You can send a message To a particular
" J& @% p& i! `3 _ H3 l // object, or ForEach object in a collection.
* V) W, B: j1 k: c5 p: F* @6 |
/ B4 S; J% J9 |, k3 n% o" b6 l // Note we update the heatspace in two phases: first run
; D& m! f' D, e( i+ r, I, N9 K // diffusion, then run "updateWorld" to actually enact the
" s7 z. @. }, e; P0 t // changes the heatbugs have made. The ordering here is
# N' ^5 c6 L6 R) t2 x/ j- i // significant!
* ^' f/ ] A [8 l. Q 7 P( b+ ?* i3 ?
// Note also, that with the additional& p5 Q+ v$ {6 U: L+ {' d$ M
// `randomizeHeatbugUpdateOrder' Boolean flag we can a6 M6 W1 ]3 W0 P! {
// randomize the order in which the bugs actually run
* i2 L8 i$ N o+ A3 Z; ~ |5 E // their step rule. This has the effect of removing any
0 ]$ z& Y6 t8 n# c // systematic bias in the iteration throught the heatbug
5 V g/ T# j" W // list from timestep to timestep
; O9 U7 e: j$ l4 k0 D/ \ t 9 a7 s9 D3 W' G9 m* F
// By default, all `createActionForEach' modelActions have
7 s/ Y3 M) t# T; E! ]' f // a default order of `Sequential', which means that the9 p- v1 H* f) }1 s$ s+ U/ t7 r( ]
// order of iteration through the `heatbugList' will be
. L0 p+ R3 j: X* ~4 z' D // identical (assuming the list order is not changed7 M$ o8 [( m, g5 w
// indirectly by some other process).
. F( B' @; K; I) c8 n( [* z- U 1 w9 M a( [9 N. J6 @/ d: R
modelActions = new ActionGroupImpl (getZone ());+ u% [; Y2 U5 `8 a l
1 m: z" k3 d! r
try {+ C' c- y }4 j8 O5 e; k( C/ i* F
modelActions.createActionTo$message4 t# _- M( Y" j
(heat, new Selector (heat.getClass (), "stepRule", false));) _" d2 Y; G( s0 O! {
} catch (Exception e) {6 b! S: D4 u( i5 r9 ~
System.err.println ("Exception stepRule: " + e.getMessage ());
8 J" T( M% [( t/ Q0 V }% l* m0 f' r, D- g2 _9 c% _" z
% ^8 X" i, r( ?) D try {$ M# x& C: z2 M, H7 B* }( r
Heatbug proto = (Heatbug) heatbugList.get (0);( j/ K2 }! Y% v! Z; V
Selector sel = 9 M( K9 S) G9 J0 Q0 z) y9 `& @
new Selector (proto.getClass (), "heatbugStep", false);: M$ k/ @7 y+ g/ K2 Y5 _: j6 l: @
actionForEach =4 s- M$ d: L: G+ I7 ^, P y: h
modelActions.createFActionForEachHomogeneous$call4 \, |" Q! R1 _" Q/ s; |% {5 k
(heatbugList,
8 C& i3 D5 i/ S+ { new FCallImpl (this, proto, sel,
5 @, \' y0 x' ~) z u+ K new FArgumentsImpl (this, sel)));
6 Y! f+ v0 e7 P+ |7 }8 B: z } catch (Exception e) {
# X: p9 w5 }: w e.printStackTrace (System.err);
% R6 x. U1 @% ~5 B' g6 t y* | }
7 J" U. q; L# D% k2 g) {
0 K F& F+ }6 U* Y) r! B( E p syncUpdateOrder ();. h. Y( |# O% K% s( H5 h M& h
( C! e8 k h* K" B% Y" L6 V try {
# \# m7 x! L/ E) H+ n: U8 ]- ?$ k {$ u modelActions.createActionTo$message
' e8 J: M9 u: c; A$ }5 Q1 A0 f$ u (heat, new Selector (heat.getClass (), "updateLattice", false));3 k& U9 L; [( q
} catch (Exception e) {
, _% h' Y, H7 g System.err.println("Exception updateLattice: " + e.getMessage ());
; \3 X8 l C4 ]& l9 s8 J. E! y8 X }
, ^3 Q) I2 S9 N7 a4 B6 H e! ?8 _" N 3 |5 g% z I& ?% h
// Then we create a schedule that executes the9 g$ I, D2 r, @. _3 q1 P7 `
// modelActions. modelActions is an ActionGroup, by itself it
2 M8 ?$ r+ l2 B; h5 D/ W // has no notion of time. In order to have it executed in
' c5 F6 K' i$ |" Y. s // time, we create a Schedule that says to use the
: {5 z4 l1 c7 Q& }$ R% @$ {9 u // modelActions ActionGroup at particular times. This
& d/ m9 A; z) X1 B // schedule has a repeat interval of 1, it will loop every9 k, D4 r6 x% T& N& j% I- Z. W6 p
// time step. The action is executed at time 0 relative to
2 L) d( d1 c4 f N$ D( o6 k // the beginning of the loop.! |1 W1 r3 j1 p5 I# i
, J& h: m( [" l3 K# N0 x0 b
// This is a simple schedule, with only one action that is4 L5 ^% j9 n9 z+ w" B# F
// just repeated every time. See jmousetrap for more
5 `$ w) c5 `' j* z9 i // complicated schedules. [ ]* l5 M5 `: C4 o+ s
$ S% T& j5 B+ Y1 ]! j: A; f$ v modelSchedule = new ScheduleImpl (getZone (), 1);% {2 U3 ^$ f7 ?$ U! a. k
modelSchedule.at$createAction (0, modelActions);) e" d/ p1 |' j% x2 e" d
8 l( q! ^8 E1 k* c return this;% d2 x2 c# C( c* u
} |