HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:, Q" K$ p% p- D5 G; U( j
! V% K) s$ X6 k: L" B# K
public Object buildActions () {, L& L+ i& k: ], o6 D' A/ s1 K5 M
super.buildActions();
' V( k+ }( o% H4 g- h* A7 A 4 X3 c t- q6 p. ^, G
// Create the list of simulation actions. We put these in; s4 [# M3 E0 B8 ?) [$ L
// an action group, because we want these actions to be' }$ v! U" u" |2 y
// executed in a specific order, but these steps should5 `) D2 j, ?, k- t
// take no (simulated) time. The M(foo) means "The message9 b& o! c6 c; K* Z$ C) a
// called <foo>". You can send a message To a particular
5 K1 n h, P7 H+ O+ f // object, or ForEach object in a collection.
8 n* Z6 j: x1 t! w; |- w- k - e+ v( A3 T( }- q' M
// Note we update the heatspace in two phases: first run
! w2 u7 D& W. [" h. \4 _ // diffusion, then run "updateWorld" to actually enact the4 J+ k3 n. H3 x3 d4 {
// changes the heatbugs have made. The ordering here is+ @ A6 u+ _0 H+ K+ z' I8 v
// significant!# [" h6 s, f8 [# ^: P7 n
- S4 f7 f# r. G- w6 l
// Note also, that with the additional/ w4 k, O6 l( H Z. M8 V& ?- e5 e
// `randomizeHeatbugUpdateOrder' Boolean flag we can
* ]3 U: c3 ~) Y, t# m // randomize the order in which the bugs actually run
- b6 t5 ]! w3 O% x) [& c // their step rule. This has the effect of removing any
5 @" v1 C; ]4 l' y: j // systematic bias in the iteration throught the heatbug
7 A$ x# D8 @+ x# ~# |6 n5 [ // list from timestep to timestep
3 M. \/ H6 {8 E0 ^' @0 ?
, a+ u# j0 K: n7 _& k$ P0 x // By default, all `createActionForEach' modelActions have1 O2 G3 |6 V! e7 [
// a default order of `Sequential', which means that the7 L9 O# b1 F4 A I/ A- X4 B
// order of iteration through the `heatbugList' will be
7 D1 h& S; Q$ e& v: T6 e1 {5 d // identical (assuming the list order is not changed! F, q G; E. c7 ?
// indirectly by some other process).
! v4 @$ R; d2 ~" J5 }- k2 m
" A9 J% k4 X5 f- N7 r( w' k' d; h modelActions = new ActionGroupImpl (getZone ());
/ m7 C; `% N2 t
9 j/ r0 W+ ^. J" I/ j) E try {# y! w9 x# j# l4 F8 H$ L! B2 w1 z
modelActions.createActionTo$message, ~* K( {1 D: z8 E8 h8 _2 C8 N
(heat, new Selector (heat.getClass (), "stepRule", false));, c/ u& ?: Z0 {! u
} catch (Exception e) {' [( P, w& q7 W8 J7 z
System.err.println ("Exception stepRule: " + e.getMessage ());, o% _' q5 h6 m' i* X3 B
}* F' Z. `$ j5 c! G' q, A7 Q' C* z
! q/ u) e9 X4 y& ~
try {: M9 z7 o9 \' h @( G
Heatbug proto = (Heatbug) heatbugList.get (0);+ P; j6 M1 S" I# r
Selector sel =
6 ]- r7 z8 k- _8 S new Selector (proto.getClass (), "heatbugStep", false);$ z$ }: `& Q1 l; L" ?9 ]# q" c
actionForEach =
" s. y* W& m; N( Z9 Q modelActions.createFActionForEachHomogeneous$call! v& k4 Y) l1 ]
(heatbugList,
: n/ k3 K% d9 G6 Q) Z" E new FCallImpl (this, proto, sel,
' w2 q- G% {/ J2 @# o# J+ G7 v new FArgumentsImpl (this, sel)));
1 u5 F U+ j: M" `$ m8 |3 g/ ^8 P } catch (Exception e) {' R( u) G% J8 S& |1 ]
e.printStackTrace (System.err);9 X0 ~& i1 h# j% p6 O: y
}+ X/ P/ \* g" J
, ~" P C" Y1 b
syncUpdateOrder ();) Y8 y. y7 N" i. y7 ~
/ i5 ~% U( u; p2 Q try {# ]. R3 ]- E8 \
modelActions.createActionTo$message 2 I8 F- ~1 g: Z' s
(heat, new Selector (heat.getClass (), "updateLattice", false));! o; Z1 v! W9 f$ X3 u1 @ Q& _$ k
} catch (Exception e) {* J+ Q; ]0 z: j& R, V
System.err.println("Exception updateLattice: " + e.getMessage ());
& S4 L. W+ D$ X; |( X, [6 Z }5 P4 w& k. f4 [" {: ], J$ _
O; S* W7 A w" P) X) f) Y
// Then we create a schedule that executes the
! l* ~1 o$ a* q w1 k0 `: M0 a // modelActions. modelActions is an ActionGroup, by itself it4 P7 n3 U/ T" n' R+ v0 Z
// has no notion of time. In order to have it executed in
" I# e2 z: l$ N; l // time, we create a Schedule that says to use the
( Y1 p6 H9 s6 e) p2 C3 o) ~ // modelActions ActionGroup at particular times. This
* j. ?8 q: @# b! I) o( h5 x // schedule has a repeat interval of 1, it will loop every
& D( G( l v7 E& I // time step. The action is executed at time 0 relative to" f& x" o3 z! q+ `7 C+ ?$ j
// the beginning of the loop.
* E9 r$ b& h3 `3 y0 |) D
8 L. H; J! v7 z4 V" y* q // This is a simple schedule, with only one action that is8 k+ L* p. U" A0 C7 ~' \
// just repeated every time. See jmousetrap for more
5 m% E3 E2 Q# T4 D // complicated schedules.6 P; j$ I+ B. S! r: s" n6 z
8 [$ Y, V* s. X X
modelSchedule = new ScheduleImpl (getZone (), 1);
$ _9 R+ B: n% B! d: B- g( W modelSchedule.at$createAction (0, modelActions);+ U6 V% B( K+ u. y- E3 C# B
" v! F- F6 `" l6 O" H0 P, ` return this;+ A/ ~! J2 ^+ P$ z6 }! _
} |