HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
4 f& k1 m1 M) d2 {9 _$ g+ k/ ~0 }; N% c. R: @' m7 ~( c7 h
public Object buildActions () {. G: P$ C4 ~. y+ ~
super.buildActions();
( ?+ r! \: m) e1 r' z
) o$ D' ?" \6 Y // Create the list of simulation actions. We put these in
, G3 \9 K) x3 m: n+ m$ h0 N- A // an action group, because we want these actions to be$ z o! a: }9 k4 Q
// executed in a specific order, but these steps should
% ?( T7 ^- r. U. J" s* Z7 Y4 Q // take no (simulated) time. The M(foo) means "The message
$ f1 p$ b3 U6 x" v // called <foo>". You can send a message To a particular
" A& t! ?8 J `- ^( I. c/ s5 _ q // object, or ForEach object in a collection.
) m: y: D6 R) x, l
# K" E- Z" }* L# \9 ? // Note we update the heatspace in two phases: first run8 C' j, ~9 ^" l& U6 {3 `7 c4 @; [
// diffusion, then run "updateWorld" to actually enact the6 }0 \) B' K$ ]6 M. V! d. j9 x
// changes the heatbugs have made. The ordering here is4 h$ k' p" {. M9 ~, S+ Y) Y
// significant!
7 g% r- e9 u3 G2 \4 H6 b # w" S# V1 p, ^8 T% X
// Note also, that with the additional
, B1 B* \/ J& R // `randomizeHeatbugUpdateOrder' Boolean flag we can; L5 ], u2 y- u/ Q5 H
// randomize the order in which the bugs actually run2 h/ ~/ G' {' q6 s2 B5 V
// their step rule. This has the effect of removing any
) r3 A) ^- c* }( c4 Z // systematic bias in the iteration throught the heatbug
- n g1 b1 _" S& \7 Y // list from timestep to timestep
1 D8 j. }0 ]3 |- u; p
( U% O5 g$ P4 B7 I, n // By default, all `createActionForEach' modelActions have
/ Z2 Z) G# Q. ], E" w // a default order of `Sequential', which means that the
6 _" m. k* z& e1 m& T6 A+ {: _ // order of iteration through the `heatbugList' will be1 [" V) I1 g* e) J
// identical (assuming the list order is not changed
) r7 a! F3 e5 w- B // indirectly by some other process).
9 ^" b+ n2 O0 F1 `; N# Q 1 @+ N% t* W8 W
modelActions = new ActionGroupImpl (getZone ());
" x1 v1 I/ J/ x* @& I8 G
0 D) i6 ]: K* }, o try {6 _7 R0 o7 }+ @! k
modelActions.createActionTo$message
1 S; T: z5 _2 e, h$ p" ~ (heat, new Selector (heat.getClass (), "stepRule", false));( l* h7 r) e n( F9 W
} catch (Exception e) {( b3 Y' G9 ]% _3 L
System.err.println ("Exception stepRule: " + e.getMessage ());6 ?* Z3 Z$ m B+ S& Q+ S
}* r6 q2 a7 `; p
" a# B- K3 V% r: J
try {
8 |3 v+ X$ Y; \5 q Heatbug proto = (Heatbug) heatbugList.get (0);; c# w0 ^7 ]6 r+ G( P, _( d; P
Selector sel =
( ~ C3 Q* F5 J/ x0 w new Selector (proto.getClass (), "heatbugStep", false);
/ f1 s: k1 ]* F7 b! s5 A5 }: M4 D actionForEach =
5 _1 b' a) U, u4 | Z modelActions.createFActionForEachHomogeneous$call: x2 R. Q0 b' b; S: |) |
(heatbugList,
5 I( t( m. I! a; h5 `2 v& n4 c* ? new FCallImpl (this, proto, sel,# _* b1 z+ d2 o$ C; i) l
new FArgumentsImpl (this, sel)));
( u# X" F0 C2 O; [6 j7 Y } catch (Exception e) {
& [4 u& b L4 p7 a1 ~1 V3 [$ u e.printStackTrace (System.err);( B! i& G4 O# ^, I3 ^7 O4 d
}4 Z0 j0 v M+ I1 s8 X* c3 y
4 N2 h8 u# ~) g4 M3 L9 ]
syncUpdateOrder ();
c8 p+ T$ W0 q3 b" q, W7 c
% l7 W) k$ L/ r1 `; ^ try {4 R* G" b/ [. D, ?+ }" Q2 H: [
modelActions.createActionTo$message
, r6 _; x# A U0 b0 M Z2 p! \% \* U5 p (heat, new Selector (heat.getClass (), "updateLattice", false));3 `* e8 K7 A- H* ]0 j& _
} catch (Exception e) {
/ }4 D8 ~4 t1 i System.err.println("Exception updateLattice: " + e.getMessage ());
/ ]1 n+ `( z+ D/ }6 b1 k+ X }" b; F8 i0 m q
$ W% h1 m( F$ J
// Then we create a schedule that executes the
6 H6 P9 W: | J3 I" e1 C4 U& f0 { // modelActions. modelActions is an ActionGroup, by itself it
8 I! [. Y# U& |! u w* O5 | // has no notion of time. In order to have it executed in
0 D+ `9 G L" z) t9 z // time, we create a Schedule that says to use the( b' {" C4 w; r) K
// modelActions ActionGroup at particular times. This
5 a5 e9 y" ~* d* S9 n // schedule has a repeat interval of 1, it will loop every+ a R, b- m+ n- G- `/ m
// time step. The action is executed at time 0 relative to
^! J. J1 e7 o: c" U. w // the beginning of the loop.
& j$ I* J+ s$ z1 a; Q" f/ s4 B+ F. a6 q$ b4 F; c
// This is a simple schedule, with only one action that is& y% `; {. s$ U
// just repeated every time. See jmousetrap for more; b/ M& Y/ N' R) q
// complicated schedules.& A7 b1 f8 l V6 q& p; i! z
" o" k6 t2 b, Z: x! h) x modelSchedule = new ScheduleImpl (getZone (), 1);
* T- r5 \# N7 h5 }0 l' s M N modelSchedule.at$createAction (0, modelActions);& m k9 l4 y" C" s; t5 i2 P5 u
* x: B+ h1 {9 E6 R' C; K
return this;
6 F2 `- ^: m8 J" \! P" R } |