HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:( ~% R2 c9 S; }5 G8 A6 r5 v$ y* U4 w
. O+ h6 W1 |% y. [. E public Object buildActions () {
: ~7 p3 [6 w) g super.buildActions();
! i% [7 [& p1 v6 T* i) k4 N " ^& w6 y+ ~0 k' q+ z; U; x
// Create the list of simulation actions. We put these in' @% H: G$ Z7 @
// an action group, because we want these actions to be
B& p+ d6 \" e; l% ], ^. _ // executed in a specific order, but these steps should
3 Y7 W) W, T. H; b* t // take no (simulated) time. The M(foo) means "The message
" u' t; L0 ^* e7 u, { H# B // called <foo>". You can send a message To a particular
5 m- a/ X9 Y. O, C- {' g // object, or ForEach object in a collection.
1 o! I$ K* o, u- q9 i7 u! l
& l) |) M6 w/ R5 b // Note we update the heatspace in two phases: first run5 \& [2 t* j+ K* a7 T3 ^
// diffusion, then run "updateWorld" to actually enact the
* R' u- E0 v0 S; N- Q, S // changes the heatbugs have made. The ordering here is
8 q- H$ C1 C8 f* r // significant!9 ~: A& Z% G2 [3 U* _5 y) H9 g
. W; {( T" O: K$ x& d7 ^5 C/ S. N) M // Note also, that with the additional
$ U. G. C" t/ C: \: @( m; W: k) L // `randomizeHeatbugUpdateOrder' Boolean flag we can
4 g9 q: i4 O' P/ M+ U4 e // randomize the order in which the bugs actually run5 H6 @ }! A% w! K- c, V8 I8 O" N
// their step rule. This has the effect of removing any- }% d; h# P* T) w6 d
// systematic bias in the iteration throught the heatbug
0 `1 Q3 s0 |2 I! I1 N6 B // list from timestep to timestep7 l5 R; t: B1 E/ q7 T
} L" X/ B, A# h1 ^9 f // By default, all `createActionForEach' modelActions have
- A+ x! B! B, c g // a default order of `Sequential', which means that the
) ~% o( J1 @8 g- z) T // order of iteration through the `heatbugList' will be9 H+ P% {: j7 ]* p2 V/ F+ ?0 z* V# B
// identical (assuming the list order is not changed. Q2 s' r: M5 \- A
// indirectly by some other process)." @8 Y; U+ x% m
4 i$ \1 y+ C1 N6 S4 p0 {$ x; P modelActions = new ActionGroupImpl (getZone ());
: h0 x N- M3 U2 n; C y n: d6 }) g/ |* l& B" `
try {- H6 v6 ?% G1 X$ V5 `0 C. ]4 F
modelActions.createActionTo$message" V6 P( G3 }# f
(heat, new Selector (heat.getClass (), "stepRule", false));
7 Z: Z6 ?. t7 _$ d' \- d } catch (Exception e) {
1 `1 d. Y$ K9 v } System.err.println ("Exception stepRule: " + e.getMessage ());1 \0 Z3 w% `+ J! a$ R% a
}
* s2 Q8 |( H+ T- u7 N, R4 r2 e+ v3 ^9 ]& D4 J0 V
try {
~6 Z- K! w9 E. P1 r% q Heatbug proto = (Heatbug) heatbugList.get (0);5 Y2 e, ^( ^/ z6 g6 q" V
Selector sel = % ^1 ? V" k5 c& L3 c b4 u
new Selector (proto.getClass (), "heatbugStep", false);; x x- u1 l! V, I3 m' {: D
actionForEach =/ u. t8 p% q9 k' B$ O \1 ~: v
modelActions.createFActionForEachHomogeneous$call8 ~% z% C9 C0 }# ^7 p5 T
(heatbugList,, j$ T6 ^- T' k& e2 P& U
new FCallImpl (this, proto, sel,
% |5 }1 B/ v% x% a) ]. n/ t new FArgumentsImpl (this, sel)));
4 X+ ]7 [8 C3 Q; ~$ j, H } catch (Exception e) {# J4 D3 s e6 }' q$ ]9 |9 _9 M
e.printStackTrace (System.err);
6 ^% M( D1 C' `2 I3 g }
) U- U# W! d2 B2 { . N4 z9 ^7 ^, ^! c, {" U) a! S
syncUpdateOrder ();* l; v3 F2 P, E" Y' F; g
: a: q' ]0 m# t% k( l try {
' r( H' S4 h. M# H% v modelActions.createActionTo$message
+ `" l/ Y4 t% [3 A$ W( ?3 g' d (heat, new Selector (heat.getClass (), "updateLattice", false));6 I8 n6 b! w1 j" T
} catch (Exception e) {! X7 ]4 i! ]1 {! Q: c
System.err.println("Exception updateLattice: " + e.getMessage ());" ]& e# u5 @, j& p/ ~* ^+ I, b
}
" ]* d' g6 U5 i" R0 [ 3 c8 a u, q+ F9 B7 i5 r2 M
// Then we create a schedule that executes the
# p0 r! Y8 @7 V, r // modelActions. modelActions is an ActionGroup, by itself it
) |% x# E; B; t. q) C3 _ // has no notion of time. In order to have it executed in( a4 \- n/ c+ M B( f& a5 p# Y) E
// time, we create a Schedule that says to use the
2 x6 I2 D& m, q0 K3 x // modelActions ActionGroup at particular times. This
9 f- S3 K, \ b- R1 L // schedule has a repeat interval of 1, it will loop every, @" r/ N$ q4 t( |+ E7 F
// time step. The action is executed at time 0 relative to! X6 Z# m7 Z1 P/ ^0 A( l$ J
// the beginning of the loop.
) _% M& q( O* S1 R- L
9 L& K' {0 c" z // This is a simple schedule, with only one action that is2 N# S$ D7 f: F3 q+ k
// just repeated every time. See jmousetrap for more2 b% z8 [# e. A
// complicated schedules.
: F& X9 y" H2 F) ?+ Y" d, ` z- X' l7 C- S
modelSchedule = new ScheduleImpl (getZone (), 1);
# Q7 p/ i) J; x modelSchedule.at$createAction (0, modelActions);
) g2 ^. e, `5 M* T$ W
( T. v; q2 c8 g- |, O return this;0 R$ [/ N! P6 {( x
} |