HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
. J: R: p3 ~1 D
" s; V$ P6 x- L" \$ [ public Object buildActions () {% e8 P5 H2 z' J& o" v
super.buildActions();6 Y6 G5 V$ w5 L# {, u: | c) v9 R# V
, c& K' i$ Q# @7 a. a
// Create the list of simulation actions. We put these in
+ { `0 b. d! ^9 |9 a8 g( f // an action group, because we want these actions to be6 z( e4 \ v" f7 v* [
// executed in a specific order, but these steps should$ Q, C& P; I/ ]) y2 J4 Y( q$ s2 V
// take no (simulated) time. The M(foo) means "The message
# n1 ^3 k* A. o# g; Z7 s // called <foo>". You can send a message To a particular$ N8 @# u: u. X, F( }& E9 G0 l1 z: i
// object, or ForEach object in a collection.
! l8 k- \# V* P; x, `$ Q - w* T0 T$ T% @$ u; S; X9 g: A8 w
// Note we update the heatspace in two phases: first run
z9 k' D5 ~4 k W& {% E // diffusion, then run "updateWorld" to actually enact the
1 j+ d7 y4 x5 p8 r- L, M+ A9 q9 ` // changes the heatbugs have made. The ordering here is& n0 d' X/ j- R+ B; Z; a2 N
// significant! y" Z U2 H/ u5 Z2 x" u8 R
5 T* h4 F1 n, D) c& Q6 p // Note also, that with the additional4 g' U+ q9 H. y$ e$ ^9 z5 M* N5 X
// `randomizeHeatbugUpdateOrder' Boolean flag we can
9 e! U" g* _! G8 @: v: N( o // randomize the order in which the bugs actually run
$ G2 `3 Q, ]( V5 C: `" j // their step rule. This has the effect of removing any( b C9 \& |) V8 c3 L( C( V
// systematic bias in the iteration throught the heatbug- o7 F* a0 N4 b5 {( {" X; X' B* B- R
// list from timestep to timestep+ p4 ~" y7 {% y2 o; c
3 U" T! F) q% N6 K2 L4 y // By default, all `createActionForEach' modelActions have8 {4 f/ z9 F0 r: h5 s) G: d4 R
// a default order of `Sequential', which means that the) h# |; O! Y2 A; c
// order of iteration through the `heatbugList' will be
# T7 I$ Q2 d) F# R0 v1 Y2 k // identical (assuming the list order is not changed% @; h; X% j; T3 w, \
// indirectly by some other process).$ j, [9 W* I$ I
1 M6 Y) p" e) `6 X! I5 _0 v+ ?0 m
modelActions = new ActionGroupImpl (getZone ());) C- M; h; b0 t, o5 x! L/ F
T; ^% d! H9 T8 n! X5 P/ V try {
9 }! Y+ n% x' q P$ @: Z; a% i modelActions.createActionTo$message/ U, y/ U3 |( }" R- K
(heat, new Selector (heat.getClass (), "stepRule", false));& v+ V5 G. R2 m! j, G" j
} catch (Exception e) {
0 b( J1 q8 h4 P3 j3 {( H; l System.err.println ("Exception stepRule: " + e.getMessage ());& i, U( P% v- ` t/ [. {. D
}0 q$ u% q8 m. @' I1 x
- |# C9 i% O) l6 e3 B! w) A
try {
! b3 V/ t& j8 t# L; |7 N& p; S Heatbug proto = (Heatbug) heatbugList.get (0);
; o$ \0 B2 p6 D. ~' Q4 h Selector sel =
* V9 G6 _/ ` m. l new Selector (proto.getClass (), "heatbugStep", false);! r# q& @, h: F! s" t
actionForEach =
" D" o! W' R/ N# j/ [8 [# C modelActions.createFActionForEachHomogeneous$call: I/ `9 y/ L5 \8 A7 i! x
(heatbugList,
2 E' K1 Y# K* S4 p+ ] new FCallImpl (this, proto, sel," Y; _3 r8 _# F* B! u' y
new FArgumentsImpl (this, sel)));9 ]/ c4 z8 n3 ^
} catch (Exception e) {
9 }9 O, V) \% t/ F1 Z* G2 m# ? e.printStackTrace (System.err);
' J& I/ R3 l, t- [* G/ Z2 ] }: J* k4 z+ m. o3 n0 d# F+ Q! A6 `
8 a' `( O5 @- Q0 w# x4 [# c" z( f
syncUpdateOrder ();% C6 g5 q# ~! ^9 n
9 r {1 i6 Q/ u7 E' m/ ~
try {' j+ k5 Q8 b3 g5 D! q
modelActions.createActionTo$message - {8 \7 ]3 `, {7 R. ~8 L
(heat, new Selector (heat.getClass (), "updateLattice", false));
i+ A# R; S3 J" [, p } catch (Exception e) {+ w; G5 T1 Y. |; J
System.err.println("Exception updateLattice: " + e.getMessage ());! O7 I$ ]( Y8 Z* {$ `: I$ v: X' {5 i
}9 }3 h! N2 }- K* i& h" l# i
% G3 I0 G/ c3 x // Then we create a schedule that executes the6 ?3 k' K& r$ o* Z# m1 Y. m! c
// modelActions. modelActions is an ActionGroup, by itself it
/ l% u9 @. V1 l: N1 I8 ] // has no notion of time. In order to have it executed in8 y. l( ~& W" [
// time, we create a Schedule that says to use the
7 a3 k c8 Q. I9 r2 U3 R2 x c' G // modelActions ActionGroup at particular times. This
: u) g6 j( I4 \2 |$ S9 i // schedule has a repeat interval of 1, it will loop every" q+ T* n, o* x0 [5 B4 |
// time step. The action is executed at time 0 relative to
: `6 E% X& @; z' \3 F2 H" b3 ? // the beginning of the loop.# j4 n: [8 o% h% l* d* v
& s4 X. z$ N T1 n2 i- k/ N9 ?8 ^ // This is a simple schedule, with only one action that is
; l7 e, y- O; e1 {7 ~1 W" r // just repeated every time. See jmousetrap for more Z3 U, s) ~) H h, U9 N" d
// complicated schedules.) W& p4 d$ U k. z r) x- Q
- l. A; ]; |1 J- ]# W6 d$ a
modelSchedule = new ScheduleImpl (getZone (), 1);' q" H( v6 v: g3 K; j( p% r
modelSchedule.at$createAction (0, modelActions);# B: B! B6 C* W0 E# L0 o; o
) `" z& h( [7 W' w3 y4 }" W return this;
j* @ b7 o* k+ D1 w1 p } |