HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:1 {0 x% g; I, |- C1 C. z) R- A
# v% `, k7 l5 \: | public Object buildActions () { K7 p: w# {) ?2 X1 }, F
super.buildActions();
" S, i0 Y% E* v! a' m/ {! @2 } - C0 n# z0 h3 J& @
// Create the list of simulation actions. We put these in' [1 ?$ a6 c; E: v- X7 H1 V& `0 ^
// an action group, because we want these actions to be
9 g% Q7 N- @/ d- _7 n, |. O0 ^ // executed in a specific order, but these steps should
6 t6 S2 N) E. Z& H. l }6 }. c6 n // take no (simulated) time. The M(foo) means "The message; [, C3 j3 S% B4 f: B% q1 E
// called <foo>". You can send a message To a particular
. y0 b8 }9 f) ]7 R, e // object, or ForEach object in a collection.
, T) ~# J# o: O R5 {0 `/ z# `9 | 1 E9 S8 a1 Z X; Y" n a7 B( A
// Note we update the heatspace in two phases: first run" e( P( B: O# g, G, P, [; E
// diffusion, then run "updateWorld" to actually enact the$ r6 ^0 G h, b3 i. h0 n
// changes the heatbugs have made. The ordering here is
$ j5 N4 Y6 K+ g4 c0 L // significant!$ B4 a% S- I) ~ i7 _+ V2 T; |7 K: V
* w% D0 B0 t- d( E4 F // Note also, that with the additional
J; j6 o$ N( f5 {4 H1 q // `randomizeHeatbugUpdateOrder' Boolean flag we can3 Z5 h; H- ^4 T4 ~4 ]
// randomize the order in which the bugs actually run
i# U% E0 ^7 n" s5 z // their step rule. This has the effect of removing any$ g4 V+ g; N% n3 ?% K
// systematic bias in the iteration throught the heatbug7 c" B0 n. Y- i) P# s1 O* {
// list from timestep to timestep
; [! U: p9 r- d0 K( m- J + N7 O" H3 `/ V9 C1 b# O
// By default, all `createActionForEach' modelActions have
' `9 G/ k+ l& x# k // a default order of `Sequential', which means that the
, e. L; l. v7 {: m9 ~ // order of iteration through the `heatbugList' will be, U1 t/ a5 E3 L) ?1 }+ }- L6 D
// identical (assuming the list order is not changed' X% b& [* a$ K( M4 V; p- K
// indirectly by some other process).+ v! e. ^: c* W1 {0 Q. T3 J0 u; B; C
$ h2 j: q8 [2 x6 D, s
modelActions = new ActionGroupImpl (getZone ());2 W$ g$ L& } e! n5 ^; P6 ^/ ^
" m& t* x) f3 A: _7 T
try {: h# L+ i& i8 n
modelActions.createActionTo$message7 [. P1 `) y5 p; H
(heat, new Selector (heat.getClass (), "stepRule", false));
3 o) C1 b( v% i$ w% t. } } catch (Exception e) {3 J; B$ K! m% I
System.err.println ("Exception stepRule: " + e.getMessage ());
0 L4 H) l3 s6 J | }
, F; h" k9 ^+ d3 X% e& ~+ Q% H# J [9 j% q* H
try {
6 B" H" ?. Y( @2 _% X) Q Heatbug proto = (Heatbug) heatbugList.get (0);# b) d0 `: H" T6 b) w# p9 }9 R
Selector sel =
/ V; R, w5 t, E6 q new Selector (proto.getClass (), "heatbugStep", false);0 Z- H8 {3 A7 _, f+ J- V) ~
actionForEach =3 v$ A u8 I- U- \1 _! R- d
modelActions.createFActionForEachHomogeneous$call
$ W& e b0 g9 K% \9 g, { (heatbugList,
U8 m8 ?: l+ v! C: o, H! A new FCallImpl (this, proto, sel,/ r( p( {) A9 A+ f( K. ]
new FArgumentsImpl (this, sel)));
" o' B( {5 U( \1 K0 L' { } catch (Exception e) {
. W4 I$ E; I" ]; \7 h7 R$ ^ e.printStackTrace (System.err);& K8 I- J F9 Y( K/ H. u, c
}
3 `. ?% t' ?$ m; `0 [ ( k8 g4 Z. Z, c3 |9 |; \
syncUpdateOrder ();
% S9 {" r& \" _ n( N- Z
) [2 i6 t. {. K: S7 f$ B try {
4 x9 l* \& a/ n( A8 G1 H modelActions.createActionTo$message
$ f+ `2 a) |$ z& {' s (heat, new Selector (heat.getClass (), "updateLattice", false));
+ h! ?( f- f. w7 T( F } catch (Exception e) {
# K) n' D' d+ e& r/ H System.err.println("Exception updateLattice: " + e.getMessage ());" b. m! u7 P7 b) U( i! H# A
}1 ^ |$ L1 ~- ^: c. p. [
) k, `0 l5 M2 y: \
// Then we create a schedule that executes the( X0 h+ k8 a1 _6 J5 L
// modelActions. modelActions is an ActionGroup, by itself it
+ A) q7 X1 y5 |& E2 j8 z // has no notion of time. In order to have it executed in1 ]; _# w1 G) w& D# M: p- ?
// time, we create a Schedule that says to use the/ G4 K$ u/ u6 @4 t+ Y$ e9 i
// modelActions ActionGroup at particular times. This
* j6 K( F9 }! [+ \5 Z: ^. E5 E7 e: d6 A // schedule has a repeat interval of 1, it will loop every
, q& e0 ~# L, ^0 V7 c! s1 R* D) A // time step. The action is executed at time 0 relative to3 t$ r# F: }! `4 D0 ^6 B6 t: L' p
// the beginning of the loop. P. I9 O9 x! Q; k2 x% e E
/ K) {. o5 X% g1 U0 @ // This is a simple schedule, with only one action that is# G3 M6 \* X7 I
// just repeated every time. See jmousetrap for more
5 v6 p B* K q // complicated schedules.! q/ @; r: x/ a
: L' o' q. V5 E0 u9 v
modelSchedule = new ScheduleImpl (getZone (), 1);
" D* W/ I% z1 n j7 m" K) F' f modelSchedule.at$createAction (0, modelActions);; _6 n+ J7 h T7 C" S/ w
3 ^& D9 I* f2 n5 q/ ]% k return this;3 f1 _$ A4 u' U& J/ [) e
} |