HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
l9 P+ ?2 n2 q8 N3 o& ]$ |, l, S- w9 ?0 p9 w7 i( Z! p4 u
public Object buildActions () {% |! `( c8 K; y* G) S, `) W
super.buildActions();% J9 W+ q3 U5 w) J; f/ P% E
: k* ~7 [- z. |% K9 j$ d
// Create the list of simulation actions. We put these in8 {' j/ ?/ z2 y
// an action group, because we want these actions to be/ r8 v# }( B0 G* N6 o/ l
// executed in a specific order, but these steps should. d0 f5 D# j4 m" |
// take no (simulated) time. The M(foo) means "The message
6 z' f( Z2 O( [; P# ^2 ~$ Q* ]% ] // called <foo>". You can send a message To a particular) x! ^7 d" L% Z0 Y$ g( f& x
// object, or ForEach object in a collection.- k4 r2 E' a7 O7 J1 ]: h
0 ?1 \& n, n7 M3 r // Note we update the heatspace in two phases: first run
/ u9 p6 a" |& J% Y0 }: D; b! U6 g // diffusion, then run "updateWorld" to actually enact the
6 y) I: I# F$ E9 F) ? // changes the heatbugs have made. The ordering here is1 e8 U, q- ~- @9 d) L4 H
// significant!
' J: Y0 J; ~& }2 R
0 X2 L; |% I/ \' C // Note also, that with the additional% ?. W+ W, f* b; ]" h& B H. Y" i: z
// `randomizeHeatbugUpdateOrder' Boolean flag we can
7 _( X+ \- r- e( ?+ S2 C( e9 l9 H/ ^ // randomize the order in which the bugs actually run5 d, t' f) G0 S- j' P& u" N
// their step rule. This has the effect of removing any: P$ X" U2 V: w) J
// systematic bias in the iteration throught the heatbug% z; |* F: L4 |) s9 M: O2 y$ w
// list from timestep to timestep
4 @4 y. z- j/ O- L6 w& f4 ~
. b1 D3 {' m5 }' ~ // By default, all `createActionForEach' modelActions have/ ?6 K3 |% B* w9 P# \, g L
// a default order of `Sequential', which means that the
; @ s2 \' |$ ?. i; H' q! P // order of iteration through the `heatbugList' will be0 }' Z- e0 Q+ g, G5 z0 M' ~1 ^0 x
// identical (assuming the list order is not changed8 Q2 ^8 \( e8 Q& k, ]) }; v5 M
// indirectly by some other process).& @! V# l5 x/ E& }" R
+ A0 T3 z% k. y* _* J! w) Z$ @/ @
modelActions = new ActionGroupImpl (getZone ());* C, ~/ k5 h* s: p$ l* C
C7 U6 u, [0 Y2 L0 ^
try {
' R- t; l1 a" Z* I modelActions.createActionTo$message
5 U! c. ?$ P- c5 \ (heat, new Selector (heat.getClass (), "stepRule", false));
s! ^& [$ {, }5 U: E& x. s } catch (Exception e) {
$ [0 w3 n0 X/ v6 S( X System.err.println ("Exception stepRule: " + e.getMessage ());2 P; A% A( \: Z# [9 E- E/ W
}
8 W+ F- S/ u' s# t+ Z
- F. J& I6 @- _ try {
# {# D3 G, j' m/ v Heatbug proto = (Heatbug) heatbugList.get (0);
9 P0 G4 V8 z8 U$ E Selector sel = 3 J3 d p1 Y K
new Selector (proto.getClass (), "heatbugStep", false);+ k- j+ M& H$ q3 g
actionForEach =& g% N+ G% s. X3 f1 v6 c
modelActions.createFActionForEachHomogeneous$call" ~; ^+ @+ p% e, D' ]
(heatbugList,
( t/ Z5 m6 h X# |5 X2 k new FCallImpl (this, proto, sel,
3 p$ J, q) I# n7 ? new FArgumentsImpl (this, sel)));
4 q0 z5 q+ s. y* g } catch (Exception e) {2 _3 X7 { M: r5 @! V
e.printStackTrace (System.err); p* {. @8 r2 N- n9 @6 p
}
- d R! b3 [0 P* i! T
! S7 N3 z1 \9 e) R syncUpdateOrder ();
' q6 N8 F5 G. Q* [) k3 q J/ i3 K: K
try {, y+ C T# P+ c( e
modelActions.createActionTo$message 0 k! B( t' i0 ]( \ m2 W/ s1 q
(heat, new Selector (heat.getClass (), "updateLattice", false));. n$ I/ e) q" Q7 h
} catch (Exception e) {* v0 a3 |' F+ w2 ?0 ~7 T. e
System.err.println("Exception updateLattice: " + e.getMessage ());8 l/ o% {& ?; A b! U. h
}
9 B6 Z8 R6 b; @& d
: u; C3 L! j% b/ n& D, s3 b // Then we create a schedule that executes the
0 F9 G0 f& m8 c& b // modelActions. modelActions is an ActionGroup, by itself it
2 q% m3 e2 h/ N) n/ k2 K! o( j* |: l // has no notion of time. In order to have it executed in
- U' Y {; I9 J& k. K // time, we create a Schedule that says to use the! ] m+ I+ J( V/ a3 y
// modelActions ActionGroup at particular times. This
4 {% D' @7 t( w+ r. _0 @ // schedule has a repeat interval of 1, it will loop every
9 O4 i2 d7 v- J' m5 T R$ L7 }; u // time step. The action is executed at time 0 relative to( B8 `7 {+ m0 S% w
// the beginning of the loop." _: h0 n* t/ c/ Y
L0 V" K( w: N7 E' M/ i5 O+ n# e4 D
// This is a simple schedule, with only one action that is# \# P# I I0 v0 U3 M& r
// just repeated every time. See jmousetrap for more
0 C- A9 }' p: r) L0 i // complicated schedules.) \ J" l3 I5 a# l
3 [2 V7 Q C# ~6 a% N4 f
modelSchedule = new ScheduleImpl (getZone (), 1);
# m( p8 M0 S l! a2 J4 D modelSchedule.at$createAction (0, modelActions);$ V' x6 @# j0 j0 _. m
0 D5 i- ^7 y- E return this;& E; g/ q5 x8 D: m4 x
} |