HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
% [$ X$ E6 }: x
/ `. L. T* d* Q) g- q public Object buildActions () {% A7 @9 b3 Z2 j+ x" n# g
super.buildActions();- j* D8 Q9 ]0 T8 m/ e* V; F
0 t/ \2 h$ z" C: ~! I+ i; w // Create the list of simulation actions. We put these in2 S* e+ p' p6 [7 Q
// an action group, because we want these actions to be
0 _ l& w; i1 a! { N // executed in a specific order, but these steps should
9 v' o V! v/ a // take no (simulated) time. The M(foo) means "The message
3 g8 x8 R; S1 f+ Y( k7 d // called <foo>". You can send a message To a particular0 O. A0 z& J2 J7 Y M: b
// object, or ForEach object in a collection.
+ |& ?& g2 Q6 a) }) O/ [! w% X, `
! Y5 t% d/ H$ m // Note we update the heatspace in two phases: first run% Q% N5 R- c+ G
// diffusion, then run "updateWorld" to actually enact the
I# |* {* v& Y2 x0 s+ q // changes the heatbugs have made. The ordering here is& g" e9 `) u( d( U3 R
// significant!
" v! \5 H6 `3 p+ Q! E' i$ u
) D, f$ |0 k( R x% ?' X$ r5 G7 M( N4 F // Note also, that with the additional
- M- c0 T8 _/ t0 ]. Q+ m // `randomizeHeatbugUpdateOrder' Boolean flag we can$ F. I1 i/ ?, R5 H1 i2 ^% J
// randomize the order in which the bugs actually run& l8 p( f8 j( z, a+ ]: w3 c
// their step rule. This has the effect of removing any
+ y1 \) p7 ^8 [ // systematic bias in the iteration throught the heatbug
( h% n- f' Y$ e( L' m: b // list from timestep to timestep5 \. A0 H# b4 c# ^' b* ^
; D5 c+ Y7 V# A) _ // By default, all `createActionForEach' modelActions have1 b( T0 ~" }8 y
// a default order of `Sequential', which means that the
3 l$ V. q. p" V: w% a, J! R // order of iteration through the `heatbugList' will be j& C4 {6 H& s3 m6 X0 f. T, o
// identical (assuming the list order is not changed0 T0 G2 D( n2 n/ @# Z# U: r
// indirectly by some other process).
* V5 U! w5 N1 P o# Q5 d2 H . D) ?3 ^4 |! G
modelActions = new ActionGroupImpl (getZone ());
% a. T Y4 x& \
/ w+ m* F2 q5 o* M try {
1 z& e2 ~4 ?: x4 c, c N+ l modelActions.createActionTo$message$ C9 D' K# d+ n+ p/ w x) q
(heat, new Selector (heat.getClass (), "stepRule", false));; q* u+ h1 ^6 I H# Q1 w
} catch (Exception e) {
# t; K( l3 k; G9 o3 ~- j System.err.println ("Exception stepRule: " + e.getMessage ());5 I: M6 r. y3 H- a" m
}) T' g, e1 w- ], V; E7 z+ U
; Z" m8 ^4 Y1 p try {- J$ F& G: ]; `8 x; S* Y9 W" ~) G
Heatbug proto = (Heatbug) heatbugList.get (0);
. N# T A' {# R& o9 u% _ F5 ` Selector sel = " {1 A- f/ h, W1 \( l
new Selector (proto.getClass (), "heatbugStep", false);
, p3 p! M0 W9 R. T" b actionForEach =
2 _/ R3 e& Q2 Q9 _; E8 s modelActions.createFActionForEachHomogeneous$call
2 c$ L5 f+ Z8 t* R (heatbugList,
b8 F! O- d+ v9 U7 l$ O$ G& U! u& h new FCallImpl (this, proto, sel,7 {, c, v2 _* y$ \4 w" ]$ n0 P
new FArgumentsImpl (this, sel)));
& D |5 D/ y; ~ } catch (Exception e) {
0 t1 w4 |+ y7 {& z: {. J2 _ e.printStackTrace (System.err);
. k& W/ l' Y' n w# V }* F/ h5 x3 e& X. @1 Q$ r
5 O$ j$ |, o0 t2 ^% `
syncUpdateOrder ();
0 }% E8 B7 N( x
+ s9 G; _ P1 T8 D try {
; `4 D, n* f% j3 f0 |, R modelActions.createActionTo$message * `- |7 c: B/ y. U# u- Z/ N
(heat, new Selector (heat.getClass (), "updateLattice", false));
. g2 _$ a9 a6 N% i3 C } catch (Exception e) {* d/ [% Z3 [& B2 i
System.err.println("Exception updateLattice: " + e.getMessage ());
& h5 e) o- ^; p/ Q- [" O9 Y" o }
' f0 M) [+ I: t6 D ! e/ O, T# J& @# v$ d+ g+ S; O
// Then we create a schedule that executes the
2 k8 o t9 w% C5 K+ K5 u( \- a8 N // modelActions. modelActions is an ActionGroup, by itself it
4 A* p3 t5 @: ^8 k: c% F. T // has no notion of time. In order to have it executed in
- H9 [- J; q; d; u // time, we create a Schedule that says to use the5 A+ o/ s3 Y4 r' t) ?
// modelActions ActionGroup at particular times. This" r# {6 e9 Q7 M" ~& H0 L1 _: h
// schedule has a repeat interval of 1, it will loop every
5 x7 c" D$ J: n- ^9 u8 B d/ F( v# S // time step. The action is executed at time 0 relative to: m$ I) j% w) [3 b
// the beginning of the loop.( e4 l z, X, E1 }( Y% o
2 K a/ f e5 E ]4 @- B' ^
// This is a simple schedule, with only one action that is& f0 z1 m$ w) E/ p# i# C
// just repeated every time. See jmousetrap for more$ E: N; g3 J$ c3 M! X" |
// complicated schedules.. A: F; @, N8 y, o# Q& r$ X
! x6 E" H9 a2 _/ f* J
modelSchedule = new ScheduleImpl (getZone (), 1);; Y# N" e5 j/ n( f! [ ]$ E
modelSchedule.at$createAction (0, modelActions);. K( K" I. [! N1 Y5 _" g
, [( R! P c* k! E9 e' l; ^# H return this;
, U* X( r' r7 E* F8 W, d% @9 l } |