HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:( o" U1 v4 ?8 ]/ c, ?3 [
$ h- K4 S. c0 Z U public Object buildActions () {8 i! ?) [: F* L9 O; g; W
super.buildActions();* A+ b8 e" b3 x4 G# O6 \! V* Z: r
, \' d$ |; f. h6 J0 r0 F% F // Create the list of simulation actions. We put these in# T3 s% r9 |) E/ H
// an action group, because we want these actions to be
/ k/ L5 b2 o P) n! \3 v" q // executed in a specific order, but these steps should4 F6 U/ F- C6 k! o
// take no (simulated) time. The M(foo) means "The message
5 w. c3 ^' @; f# o' I# F3 m$ b // called <foo>". You can send a message To a particular
& f' ?7 W6 v: d9 q // object, or ForEach object in a collection.( m! v5 [9 q8 k9 j% `, H s' Z
3 v; p7 Q( E9 e2 k; u/ L: X
// Note we update the heatspace in two phases: first run
) Z& b/ c9 A/ L* C7 f // diffusion, then run "updateWorld" to actually enact the
* O0 G1 Q5 K( K- E- S V' I // changes the heatbugs have made. The ordering here is7 \2 j6 T7 l# Q! r
// significant!
' G' j7 P* Z5 Z& N% O: S! T
+ N% ~% o' d" @4 A0 t9 b6 c% i // Note also, that with the additional U j( u# D/ ]6 ?: R* v
// `randomizeHeatbugUpdateOrder' Boolean flag we can
. K4 D; f4 S7 d1 ? f // randomize the order in which the bugs actually run
* x1 J/ Q5 @! X // their step rule. This has the effect of removing any
0 t0 E1 d" K8 ]1 U8 R // systematic bias in the iteration throught the heatbug
0 c5 M( N4 @2 y- ~# l( C // list from timestep to timestep
6 j3 `4 a: p" o9 Y1 r8 k , d. Z* \% M6 ?$ k$ [: k) ^
// By default, all `createActionForEach' modelActions have) G# ^* }! R: J% i+ Z
// a default order of `Sequential', which means that the J/ h6 Y) }$ ]) Z# ]7 j* f: V
// order of iteration through the `heatbugList' will be# s C+ C, D6 Z0 d
// identical (assuming the list order is not changed
" X a% k$ g/ W' |$ ? // indirectly by some other process).
, `4 [' r, X3 ~9 y: X/ p
9 {, ?* s3 a. {7 T modelActions = new ActionGroupImpl (getZone ());5 O% W9 ^' t2 C' C5 z2 E$ q( K
* [0 \5 ~/ v9 }' z try {
! Z* p8 g* @: ~4 I" @: V9 | modelActions.createActionTo$message8 `: A, s( D* } O3 Q; [& ^4 M4 M
(heat, new Selector (heat.getClass (), "stepRule", false));
0 @( q/ M& S$ } } catch (Exception e) {
, x/ E, Y0 [# R+ c System.err.println ("Exception stepRule: " + e.getMessage ());
6 j2 w3 K' N4 ] t) w7 W9 w% e }# u9 w) q8 X2 Z. x
8 L$ V r1 ~! o! @# j try {
9 t$ ?' c) E" a9 Y1 E+ \ Heatbug proto = (Heatbug) heatbugList.get (0);
+ `8 Z) {& b/ c9 m Selector sel =
* j$ \& W6 m2 r k0 b# o new Selector (proto.getClass (), "heatbugStep", false);* }1 h9 g: m3 a- b. i
actionForEach =
" G7 y6 w1 b- E% V% `' p* S' v- B modelActions.createFActionForEachHomogeneous$call0 t$ I8 o# Y6 X' Y' P
(heatbugList,8 b: m" v8 f6 r( U2 O j
new FCallImpl (this, proto, sel,! k) u& ~$ s* N: O
new FArgumentsImpl (this, sel)));; }% V7 j: i3 u- f8 N3 g, k
} catch (Exception e) {
a/ d4 G0 t8 I; O! C6 u; k e.printStackTrace (System.err);+ h1 L: | n( v* @
}
0 y2 J; r8 S+ F$ B4 f+ v
5 |8 ^# e6 ], H0 U syncUpdateOrder ();
& ]# \, ?2 A/ E% U) c9 f, b
9 F+ I: F# m0 _6 I( z I try {0 r8 o8 | _1 \" D
modelActions.createActionTo$message , u8 Q, F* p- U' ^( Z" Q* `* @
(heat, new Selector (heat.getClass (), "updateLattice", false));
, Q# j9 w$ s9 O. u } catch (Exception e) {7 g# y+ H3 f, x2 ^# W$ |0 R( G+ Y
System.err.println("Exception updateLattice: " + e.getMessage ());
3 P; O$ {) O# } Q }/ v$ m7 M/ g8 z6 E( c5 O% K
' |. A, p: Q" {
// Then we create a schedule that executes the2 _# R& `% X" T6 E d% a
// modelActions. modelActions is an ActionGroup, by itself it5 G4 t2 V; O) b8 W6 @4 f5 V) v
// has no notion of time. In order to have it executed in
, ^( d9 p% t# Y6 d* ^- x9 c; G // time, we create a Schedule that says to use the/ U" ?; {# Y; g! H) _0 V
// modelActions ActionGroup at particular times. This. [6 ^ s. }2 m2 b
// schedule has a repeat interval of 1, it will loop every
. x; C2 Z; F0 P. H4 V, q9 Q: Z // time step. The action is executed at time 0 relative to
9 m1 J; l0 Y9 `' i // the beginning of the loop.
/ ]/ U# b( c' S9 m) \
6 ?1 [# q. E: u2 A // This is a simple schedule, with only one action that is# L- Y- F0 p1 M" r- J
// just repeated every time. See jmousetrap for more, t8 v+ _7 S) _; W/ Y
// complicated schedules.
, @, ^2 [9 E0 M' \- s- t- R
9 n9 A$ s! R" y) J9 R5 x modelSchedule = new ScheduleImpl (getZone (), 1);( \% D6 [/ _! u' X/ h! [
modelSchedule.at$createAction (0, modelActions);
! ]" d% D& c! y6 f7 ^
9 q7 F: p# d/ ^0 f1 p+ Q return this;
- Y r0 y1 I4 Q. `1 B* T# B } |