HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:- W. }4 f) k: y( T
' r. q) j, B2 @8 x
public Object buildActions () {
* F) Q7 U. x1 T! T: Y8 V super.buildActions();
; W1 Y. `+ y( @, Z* q. }$ ~ ^
/ y" X; f( X. R9 ^1 Q) s. A" \ // Create the list of simulation actions. We put these in7 a# u& Y1 Z/ @1 a; n# a5 B
// an action group, because we want these actions to be
4 y& H/ R6 p0 m3 j/ J9 Q; n // executed in a specific order, but these steps should" C/ G1 @+ Q: y; M) s6 O
// take no (simulated) time. The M(foo) means "The message4 ^" L9 L& ?& x% n2 e& R3 C
// called <foo>". You can send a message To a particular
. [8 X# E' S/ l // object, or ForEach object in a collection.
' n% H0 s& C( y( Y/ E* P, l ! n6 ~+ r+ u% ?! D3 O
// Note we update the heatspace in two phases: first run
5 }; U! ^2 d- @0 M, s: n7 w // diffusion, then run "updateWorld" to actually enact the
+ T7 |# f( d9 T6 ] // changes the heatbugs have made. The ordering here is6 |/ k, {5 j- }0 B. ]# [& [# O5 u4 n
// significant!: y1 | D9 ^9 O6 t0 T$ l9 Y
/ D1 `* ~1 v& q' o5 \3 [, T // Note also, that with the additional
" G5 W5 T9 G/ l$ h, s, z* V/ q // `randomizeHeatbugUpdateOrder' Boolean flag we can7 Q2 V& a, @: {$ w& N* K6 r! t
// randomize the order in which the bugs actually run
( P- D, W2 g3 f) n* R9 L* V0 x# x // their step rule. This has the effect of removing any' ^# j$ q' S+ A1 h# K0 |8 m6 v
// systematic bias in the iteration throught the heatbug2 ^1 Y6 O* C) {/ u% v3 F
// list from timestep to timestep
' ?& u; u' K" O2 j. L5 z! r+ U
3 I, _" Q8 P; e6 Y/ T a% W // By default, all `createActionForEach' modelActions have
4 S9 k$ T- l0 Z! X2 K2 G- O; p. B // a default order of `Sequential', which means that the( y7 p5 f. Q5 Y; G
// order of iteration through the `heatbugList' will be: _/ G& X6 a! k0 @* p4 R) A. ?! f- |
// identical (assuming the list order is not changed
0 z$ P+ q! P% F* ] // indirectly by some other process).2 F9 F, ~+ X' j: M: Q
/ h- E% L2 O2 f: \5 e
modelActions = new ActionGroupImpl (getZone ()); N" _# A& ]# g X. k5 V. P0 b
& |* i) I6 K$ w5 @! n5 A: R6 U2 g
try {
t n6 Q/ _8 a. @& m modelActions.createActionTo$message
( m8 {& X0 @- G0 ] (heat, new Selector (heat.getClass (), "stepRule", false));0 e1 o0 N8 b$ W& E7 |- i
} catch (Exception e) {
( O( _) l& U0 r @( X; G/ z+ U System.err.println ("Exception stepRule: " + e.getMessage ());
& {6 q. p2 c9 P- v/ V/ c }
3 Y) v$ T* U4 r# z! R+ g3 R$ e: k1 W5 q- ]4 O: J# o, T0 C# V
try {/ x" B0 Q- r% Z. u& A
Heatbug proto = (Heatbug) heatbugList.get (0);6 y6 m4 N7 V A% }3 i
Selector sel =
9 R) m" c& Q% t; J9 e' ?; ]6 Y0 m new Selector (proto.getClass (), "heatbugStep", false);
, R" F2 k# W( { actionForEach =
/ `) `* ~+ P3 F$ K$ g; P modelActions.createFActionForEachHomogeneous$call4 S5 C% L G* P- T1 B/ K
(heatbugList,
7 t9 {7 Q1 }& [+ R" _! Q new FCallImpl (this, proto, sel,
$ V3 o4 T/ Y# M3 f5 @" x; E6 z$ t new FArgumentsImpl (this, sel)));
& {, g# Y& n5 ^; p4 P7 U } catch (Exception e) {
G2 z# @6 [2 ]- @( t e.printStackTrace (System.err);
. \& n4 I1 u/ U }
. c4 ^% ~: J) K+ q
0 U6 B" U" |2 v syncUpdateOrder ();
, p7 A7 F& [+ J2 ~' y- o2 s0 | V
try {
5 [/ l1 Y' g- O7 Q3 I4 }6 n, Q modelActions.createActionTo$message
: y: u* a3 C) z* `" q, a (heat, new Selector (heat.getClass (), "updateLattice", false));
* x2 b6 K. t; n& C: m8 a } catch (Exception e) {( C% X, E4 C2 A' ]7 Q+ w
System.err.println("Exception updateLattice: " + e.getMessage ());
2 v: f( m" p9 K: j/ Q/ d- s( c; }2 |# H }
|1 |, V/ T- T+ T! _- m+ ^ 7 O8 b' C1 f8 r8 [3 a. b/ Z
// Then we create a schedule that executes the
T, [5 D9 q9 t, v* }: i // modelActions. modelActions is an ActionGroup, by itself it
x; s: ?8 n8 R7 k& K // has no notion of time. In order to have it executed in
d' X% x# h9 Q8 g6 s) B // time, we create a Schedule that says to use the" j) V/ B0 ~# v4 h0 X
// modelActions ActionGroup at particular times. This
/ O" X5 C* }) j, n$ }& b // schedule has a repeat interval of 1, it will loop every
3 `, {$ V% e% S* u( V // time step. The action is executed at time 0 relative to
+ x2 R. d! A) u' K; z // the beginning of the loop.0 W6 A5 O- i& m3 f
! p9 G) K0 I: x$ s) n4 \ // This is a simple schedule, with only one action that is) d: t- k* M' u# [$ m' K8 y
// just repeated every time. See jmousetrap for more
# l; j9 Y9 R5 ]7 m3 H; F // complicated schedules., G3 Y, Y# A! ^1 m
* c( }1 c# J; m: f% H- ^! p# _
modelSchedule = new ScheduleImpl (getZone (), 1);
, @! J0 k6 a; F9 w3 v" ^ modelSchedule.at$createAction (0, modelActions);" E! e9 S: d: ?% ]/ ~. ^. v+ K$ Z
: t! \9 t( |6 }9 N0 @ Y/ R! k/ U return this;& [& j; \) K p7 r- N! H4 J- M
} |