HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
2 V1 M) t& D% {3 Q8 y5 U# U
( ]$ i* y& p" r0 M, _5 c9 Y3 I public Object buildActions () {$ [+ c# s g2 \0 I8 c/ [
super.buildActions();
+ d8 G$ k" x( k. c% \$ d
' T, H" `& O( i1 M/ \5 k // Create the list of simulation actions. We put these in
q: |7 G' i8 X2 L, z( J // an action group, because we want these actions to be
: O5 }# r+ U9 t1 p- E. l // executed in a specific order, but these steps should
% b. n$ j3 @& c9 u* C. C // take no (simulated) time. The M(foo) means "The message
+ e" t8 B5 ~% T3 W: |' ^2 y# X" P // called <foo>". You can send a message To a particular
( ]% C7 u& K& ?, [& ~+ l+ q // object, or ForEach object in a collection.
& @/ @6 C% L& g& h8 ^# d; M + t; l1 x7 b! }4 {8 s
// Note we update the heatspace in two phases: first run
+ _% i( P" ^2 O4 E H // diffusion, then run "updateWorld" to actually enact the
. V& ]+ a5 d3 d* @5 Y8 k, E+ P // changes the heatbugs have made. The ordering here is
6 Y8 F9 n" w# P% G, H' F // significant!4 B7 j5 }" u3 t0 l1 A+ Y" Y
% H2 k9 Q' t" A2 O( Y) b
// Note also, that with the additional: q6 P% K, U# N& D! p/ s- V, d
// `randomizeHeatbugUpdateOrder' Boolean flag we can
* c. B5 ~; e8 `/ U // randomize the order in which the bugs actually run
: A' |2 [7 Q6 X5 u2 r. N // their step rule. This has the effect of removing any3 p) g* L1 w; B: e9 j' _. K3 _
// systematic bias in the iteration throught the heatbug% C' N2 x% ?* u0 {2 H0 j" \
// list from timestep to timestep) Z, E& K8 }+ \6 V
7 t5 Z6 ~; k" X" z* E; j! w
// By default, all `createActionForEach' modelActions have
+ d" @+ Y1 e8 S. j // a default order of `Sequential', which means that the* Q* B, A- S% x9 V! z0 {- h
// order of iteration through the `heatbugList' will be. u2 W- E+ |: [
// identical (assuming the list order is not changed8 f% L5 l; y4 J' A/ O* N# W
// indirectly by some other process).
2 z6 G$ w C8 v. @/ k4 w
6 K4 `. g/ b+ ?* C modelActions = new ActionGroupImpl (getZone ());
, D$ _5 H, X. n, D8 `" P, |! L5 i8 _, S4 C4 y5 l
try {: N3 X) A4 \' ]/ l2 y2 i
modelActions.createActionTo$message9 K+ N) x2 Z3 u; ^& H$ Y
(heat, new Selector (heat.getClass (), "stepRule", false));
# N" s5 n4 C+ H } catch (Exception e) { n% \5 _1 s- B% w- h
System.err.println ("Exception stepRule: " + e.getMessage ());
) Z7 F7 ]& M y) x+ k }# q2 ~6 c* U! N+ G M9 X1 v1 T6 r- ]
' m% s4 }6 S1 W8 [& m4 R
try {
' r3 t- g* X) N; ]! O! g- A Heatbug proto = (Heatbug) heatbugList.get (0);% x6 \' w9 r) w* u$ k1 E U
Selector sel =
. X: G" \ M- z new Selector (proto.getClass (), "heatbugStep", false);
G# S8 D5 B( p' _ actionForEach =$ K9 @4 H6 g$ @/ d4 A; J2 l/ l) u
modelActions.createFActionForEachHomogeneous$call
8 K+ ?4 N8 k1 P5 ]* N1 [0 F0 I (heatbugList,
# W& \: I t) y9 i2 S new FCallImpl (this, proto, sel,; y* J! ?# s! g1 @5 P; J' q5 I
new FArgumentsImpl (this, sel)));
4 _& V+ d, `' L$ g* L9 I3 x' B } catch (Exception e) {
% x; X3 L" R2 T" f& P7 }9 U' B% Q) C e.printStackTrace (System.err);( g4 f+ a& O. K- W
}5 P5 ^* [5 ?0 S5 L2 H+ V3 [' ~
8 I5 c/ a; ~' P/ I! p& C0 G# c syncUpdateOrder ();& y* g9 ~5 ]( X- {" r
- T; s5 j: u0 W0 Q' V" j1 Y [- l$ l
try {
& G: ?4 i4 O0 s. @& ?1 U; W modelActions.createActionTo$message
3 M' D. t5 ?6 A& P- z& B. H9 [ (heat, new Selector (heat.getClass (), "updateLattice", false));! T& [0 }+ }# x, `
} catch (Exception e) {
2 u$ n0 a+ i8 x7 t6 j) @$ W5 K# X$ L, p System.err.println("Exception updateLattice: " + e.getMessage ());
( ~1 ^7 M0 n7 f2 N/ B* { }2 \; D$ q1 u, W
* f+ _0 q0 z7 U8 [. I // Then we create a schedule that executes the* Y! `* i9 z: c8 W2 H
// modelActions. modelActions is an ActionGroup, by itself it
3 B0 W0 F u- |! p1 ]: C // has no notion of time. In order to have it executed in% O+ e, `' ]$ r0 g
// time, we create a Schedule that says to use the5 m2 V8 ^' ]- U U. P) O6 D# k
// modelActions ActionGroup at particular times. This
0 A: x/ H1 I/ N& B: _& ^( `4 L // schedule has a repeat interval of 1, it will loop every4 G- E" y+ O" U; M
// time step. The action is executed at time 0 relative to
% x# X# I: Q4 |/ l0 ~0 U" H! m8 I // the beginning of the loop./ T W) F4 K! B$ U1 t% i e; @
) O l& r. V. p4 }/ z% `2 w ^ // This is a simple schedule, with only one action that is6 N$ N5 P0 [. \9 h0 i+ g' i2 U
// just repeated every time. See jmousetrap for more& p9 m9 F; i% z1 Q$ p
// complicated schedules.7 c/ _ ~! h/ w& v
4 c0 Y( E1 e! e- G; E8 p
modelSchedule = new ScheduleImpl (getZone (), 1);6 j0 k V; j6 Z8 }
modelSchedule.at$createAction (0, modelActions);
6 L7 b" w3 Q9 g# C& L8 K, y% Q
7 |. H1 L1 g* X/ l& R return this;; J4 K$ p8 q8 N' P' I4 V$ o r0 i
} |