HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:) `6 u$ L! W! e# U! A
4 v* C. d$ d) Z6 `1 ^3 | public Object buildActions () { c5 ]4 Q$ h" M0 T( r
super.buildActions();3 I/ p, k/ S! w' W' v9 \
( k* L v2 c! {# E! i0 U
// Create the list of simulation actions. We put these in$ ?" ?; Y) M+ C0 @! |& Q* R0 D8 P7 _
// an action group, because we want these actions to be
6 m* x% t9 `* f/ _! O // executed in a specific order, but these steps should
^: S! d6 G! L$ t; e, X8 W8 n t // take no (simulated) time. The M(foo) means "The message6 q! `' c8 j. n
// called <foo>". You can send a message To a particular3 f: C% q6 Z$ z
// object, or ForEach object in a collection.+ j3 `' p+ j, e; _9 b. ~
* h/ s O* V( y' M' I // Note we update the heatspace in two phases: first run
6 j; J6 f+ y8 e+ \: K# P2 i/ R // diffusion, then run "updateWorld" to actually enact the8 N. K. B. F% l/ E8 R' u
// changes the heatbugs have made. The ordering here is/ R1 n6 a1 J5 X" P! S+ |4 M
// significant!0 @! w2 |( I4 A( C% X
: Y; d6 \) X9 e3 ]9 l# p' X# D+ o0 C
// Note also, that with the additional
" e \0 {$ w' H0 t! ^7 e // `randomizeHeatbugUpdateOrder' Boolean flag we can: c1 Q# u% P3 z5 O' ]6 \
// randomize the order in which the bugs actually run& Z: y# e) i9 k
// their step rule. This has the effect of removing any
! l. h7 r: \( r+ l( l; ` // systematic bias in the iteration throught the heatbug
2 Z. {4 T3 k5 c // list from timestep to timestep
" X" {4 r' j( q. N1 _0 ~2 u. G
8 J2 @* n' f1 w) ]( S% l. u2 j // By default, all `createActionForEach' modelActions have% }% z/ u* n3 a$ t
// a default order of `Sequential', which means that the
" D. g2 O8 Y6 L2 k // order of iteration through the `heatbugList' will be
- p$ |, d4 g+ t B4 d% D // identical (assuming the list order is not changed) ^6 c$ L5 i8 v2 s7 c
// indirectly by some other process).0 E2 E7 f; o$ f8 V$ ?7 w
3 k6 w1 h9 x8 @3 ^- a modelActions = new ActionGroupImpl (getZone ());! U( R, ?# j8 R' h" ~
8 E' v) \; Z2 W( Q4 R6 T
try {
+ W1 a. r' s5 _; @! v T" t modelActions.createActionTo$message
g$ Z( P, G4 J* K/ ]1 V (heat, new Selector (heat.getClass (), "stepRule", false));
4 N/ J, F) S; R- k8 J4 H1 ` } catch (Exception e) {
0 U: w" G( r: I8 P System.err.println ("Exception stepRule: " + e.getMessage ());( l! v. V* n1 |* \# @9 _- \8 w
}
+ B. R* f' @2 A6 d0 S2 Z/ u3 a! T# t% `# F) g% z
try {2 T: U; d' N& ^5 c2 e
Heatbug proto = (Heatbug) heatbugList.get (0);& \* I& r _# w7 l! H: U: J* l
Selector sel = 3 V- {3 J# P+ b+ p
new Selector (proto.getClass (), "heatbugStep", false);
. f1 I0 V9 S$ g9 b actionForEach =1 I. c+ x) Y7 h+ u2 c+ O* P
modelActions.createFActionForEachHomogeneous$call3 X1 M( A4 U% d
(heatbugList,' K( v# E$ p; ]* M
new FCallImpl (this, proto, sel,
/ F/ |8 D F! B& u. x& G new FArgumentsImpl (this, sel)));& ]! L& o# B5 k% W2 X% ?9 ~
} catch (Exception e) {, w0 c( m* [6 _1 s
e.printStackTrace (System.err);
1 R9 }& h5 n( z6 D }
! e0 C. R. I% y% J2 \3 \) r. R + T+ N! H1 q9 B
syncUpdateOrder ();7 i, x1 |$ }' w" d6 j, J
" |3 R* {2 R L1 ^$ r try {) o, U% v7 [5 ~+ v, V1 j% q6 [
modelActions.createActionTo$message
3 I- i1 ^+ Z, [* j1 ~ (heat, new Selector (heat.getClass (), "updateLattice", false));- M6 G+ s( _& f7 j6 d! D+ _7 k1 W/ d
} catch (Exception e) {3 @' |' f5 {; c' Y6 i0 v
System.err.println("Exception updateLattice: " + e.getMessage ());
( j' d$ P$ x. v! _) b+ T# O+ @ }1 i! u! T# k0 m9 r) j9 a
5 M) Z0 ^5 f6 C. a
// Then we create a schedule that executes the, c z/ ^# o0 q3 x6 x7 {7 k
// modelActions. modelActions is an ActionGroup, by itself it7 ]" @1 c* o; v$ O" L1 e' P
// has no notion of time. In order to have it executed in
# c" C8 i! k: X" F, Z // time, we create a Schedule that says to use the* [3 Y: T( M5 A( v" @! R
// modelActions ActionGroup at particular times. This4 [6 j# {! Q9 Z1 g
// schedule has a repeat interval of 1, it will loop every
, b6 a1 `6 L: f: }1 K // time step. The action is executed at time 0 relative to
5 \. O/ C9 h, W2 u( q/ r // the beginning of the loop.& X, c. U, T2 z4 _
2 D1 P7 n6 ]0 C7 f" f) I/ B6 B# N // This is a simple schedule, with only one action that is' J2 ]: L* h3 d% ?' k C9 j- G' G( ?0 G* G
// just repeated every time. See jmousetrap for more3 M6 h0 N! U; n: T. E; V8 `
// complicated schedules.. N1 g' G3 F+ c0 j! ]0 [+ K7 a
& g) Z8 f, v! N# u; ~
modelSchedule = new ScheduleImpl (getZone (), 1);( c- m/ H0 Q4 u
modelSchedule.at$createAction (0, modelActions);
: O$ u/ \% q8 ] 8 O! k0 g# I+ b, `
return this;
( Q3 H* H7 q5 b3 z; G% G } |