HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
/ d4 H3 g7 ~0 _5 ?1 s- Y: f2 Q/ `9 x1 j* R5 W$ _0 ~
public Object buildActions () {
! c3 r( M2 z: L& Y super.buildActions();
5 U' t6 S2 A1 H h6 @5 u' X$ o
2 a" F4 D: G4 o! ^1 Q) D // Create the list of simulation actions. We put these in
0 Q0 l* g. G+ J0 ~ // an action group, because we want these actions to be7 E& L. J/ D' R$ x/ L6 v
// executed in a specific order, but these steps should
1 a: F R7 Y! U# r& p7 Q$ k$ w // take no (simulated) time. The M(foo) means "The message% b+ E R: {1 _; G3 F
// called <foo>". You can send a message To a particular2 @$ V7 t8 s0 n/ b
// object, or ForEach object in a collection.
4 T5 b& k/ b1 d8 Y3 ~( I
: ^, W0 o; S, Z7 n. z+ v: }& s# a o4 E // Note we update the heatspace in two phases: first run2 S( [0 S' K4 Y* @0 M/ j/ j5 i! J
// diffusion, then run "updateWorld" to actually enact the2 c! J3 [: F M
// changes the heatbugs have made. The ordering here is1 z# D# |9 h3 k" M1 f" r
// significant!1 {2 K) Q; } j! k- P5 W0 W
4 v1 o& a' M3 C/ f: | // Note also, that with the additional
# G2 `9 C$ d& u+ m4 C // `randomizeHeatbugUpdateOrder' Boolean flag we can/ U# t) T1 ~. O* M6 D! j
// randomize the order in which the bugs actually run, P1 p6 z5 g) o4 w+ ~& \; y5 t
// their step rule. This has the effect of removing any
: J0 o0 |1 \9 T8 G6 D // systematic bias in the iteration throught the heatbug* v/ l3 B1 W. T" n
// list from timestep to timestep
: o |( H+ Q+ e0 j- U6 P+ H% W
: }# {/ i. A+ ~8 v! X! {$ Y // By default, all `createActionForEach' modelActions have
, I3 z* m' l- k1 h5 F5 l' ] // a default order of `Sequential', which means that the& E" t: L8 N( M
// order of iteration through the `heatbugList' will be
# O3 q, [# L% _& r6 ]# r3 [ // identical (assuming the list order is not changed( t6 ?2 x% q4 Q9 w( a2 a
// indirectly by some other process).
" d z& i" j3 o- ] 6 S7 R2 T% c8 k G
modelActions = new ActionGroupImpl (getZone ());
( _9 z+ W/ v' d5 y: F
" ^2 R7 W- f: ?" `9 z6 H1 ^/ L8 S try {: v. @1 K5 a2 Q* j. |
modelActions.createActionTo$message/ i3 a+ H; C0 R7 K4 `
(heat, new Selector (heat.getClass (), "stepRule", false));% Y" d4 \$ B3 @* J1 B7 g7 p
} catch (Exception e) {
& l5 o4 |( Z. ~( ]1 y( e( b! ` System.err.println ("Exception stepRule: " + e.getMessage ());- X! `1 `& Y y. c& [7 ]2 _" f/ Q
}
' P1 T& J- a) b* r8 z5 E' P; Z; r6 Z& z* k9 W
try {9 R$ j3 f1 U7 P' f- e" M
Heatbug proto = (Heatbug) heatbugList.get (0);/ q% J' y B7 f6 w
Selector sel = : A7 z" t. _8 j: F, M- R7 W
new Selector (proto.getClass (), "heatbugStep", false);
& r8 r* |9 }9 u: t L2 \+ @ actionForEach =/ K2 w D' Q! Y! u& f* S7 Q, C) [8 G
modelActions.createFActionForEachHomogeneous$call
/ }! x5 v y& b/ o9 E3 U- o: t1 g (heatbugList,7 m& o, q& l* O# I% H! \& c% H
new FCallImpl (this, proto, sel,/ u' o) Y0 ~; Q. d
new FArgumentsImpl (this, sel)));
8 \) ?* H) X- ?5 V/ ~" o } catch (Exception e) {
& v& h! m4 P3 r* w0 D; H0 R7 e; k e.printStackTrace (System.err);
; y# s3 G" g" u0 C }
- s# k. c3 r. h/ u& f % F. X1 p; A5 x1 ^3 o
syncUpdateOrder ();- M# @( n1 g, Y9 p, x
6 S; M) I5 W& k3 H9 O; {
try {
, M9 |5 ^' E2 U$ t$ Z, {0 C9 f3 X modelActions.createActionTo$message
/ i6 e' g, b5 u (heat, new Selector (heat.getClass (), "updateLattice", false));
: R& b G; }, T% S } catch (Exception e) {; h; R8 K4 B/ l- _+ A% w
System.err.println("Exception updateLattice: " + e.getMessage ());: X. @, y9 c9 R& d- R" j% ]9 [
}2 G. u/ v( M5 Q7 g
- p# K2 U1 R b: X) \; B' T
// Then we create a schedule that executes the
. y7 \; T$ G7 w1 ^7 v& \ // modelActions. modelActions is an ActionGroup, by itself it* \9 n' _) w* {) ?- G/ k2 h2 ]
// has no notion of time. In order to have it executed in
# U& K& J9 o( d6 f! ]% h // time, we create a Schedule that says to use the
' V, i3 x# e2 ~3 x // modelActions ActionGroup at particular times. This" }+ K2 N5 |+ H- ]3 I, l2 ~. H, `6 @
// schedule has a repeat interval of 1, it will loop every
* V; ^; }6 p1 D5 S" E/ \ // time step. The action is executed at time 0 relative to
1 y, L, C/ d) l // the beginning of the loop.' O- o6 e% M9 o! N& Z$ o
6 e3 H# T6 t; M8 @, o- V // This is a simple schedule, with only one action that is
9 L6 E+ R' n. o1 B // just repeated every time. See jmousetrap for more
( B D; l6 n# x5 V& |5 o, ]; [ // complicated schedules.
/ h% Z- z% H+ S! t9 v " V2 k& \) J$ t& Z& B
modelSchedule = new ScheduleImpl (getZone (), 1);7 H3 s# K2 F |2 b
modelSchedule.at$createAction (0, modelActions);3 a% H e* a1 {; |: h) x7 b/ _
y6 a! L& b$ _0 Y* F return this;
6 W! Y e7 F8 P) i } |