HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:/ @9 }& g: M0 B4 e" d# u- ]. C$ X
0 f2 p9 ?/ I( K, o1 C% ?8 m& g public Object buildActions () {
W$ N7 E& i+ v# e; X% \5 U4 i* ^& m super.buildActions();9 [5 `7 z. a7 l$ E& O) E# Q0 I9 d. T
5 y( j* V) f( p' |" v# b // Create the list of simulation actions. We put these in; W! X1 V B1 z0 i5 e; r: @$ x
// an action group, because we want these actions to be
" {' j% `( j, M5 s% v2 I7 v // executed in a specific order, but these steps should( u( i7 e: Y6 q x4 G
// take no (simulated) time. The M(foo) means "The message+ f; k: h, F8 x9 q4 u+ z) B1 U
// called <foo>". You can send a message To a particular
) [, L/ X1 J. x$ G: q1 D, } // object, or ForEach object in a collection.9 h. t5 u5 V V7 ]
# l% {% {4 d9 S- G' y
// Note we update the heatspace in two phases: first run
, V- U8 C: h, `* @( h // diffusion, then run "updateWorld" to actually enact the9 R' I$ ?5 \( \5 h: x1 M- g
// changes the heatbugs have made. The ordering here is
2 p/ n) i" O ?: K* _- w // significant!, ^2 l; H( V# K, E( ~
9 C7 _2 ]4 C8 o6 C1 e3 s
// Note also, that with the additional& x" R* v7 j5 p! g! U7 y
// `randomizeHeatbugUpdateOrder' Boolean flag we can
9 n* ]* }3 ]7 X! r& o) P _4 Y // randomize the order in which the bugs actually run
- M4 X$ ~. U% t% w( x // their step rule. This has the effect of removing any
9 @7 o( k [! {6 t' U# {5 Z // systematic bias in the iteration throught the heatbug* B, C [8 F$ c5 ]3 r" p
// list from timestep to timestep! F! T* t6 n3 @: l1 m
0 i' w) y1 Z8 i4 K // By default, all `createActionForEach' modelActions have
) b5 P& ]* W) [8 V // a default order of `Sequential', which means that the
; z) D, b! P! G. {1 z$ a( n+ D- W) I // order of iteration through the `heatbugList' will be9 G# m! l% w. C9 w
// identical (assuming the list order is not changed
1 c, x8 Z/ n2 \# Z; S+ t3 y( f( Z% l // indirectly by some other process).3 y& C0 _) _- e
4 d, y* n7 V6 Z; c
modelActions = new ActionGroupImpl (getZone ());
+ o7 ?1 b: }2 A8 a2 Y( J8 l1 P; f) J/ a9 C- E% i
try {$ t+ O3 Q9 X" b6 j
modelActions.createActionTo$message8 z" A$ v7 s/ P& O$ D
(heat, new Selector (heat.getClass (), "stepRule", false));
+ k2 J p- E4 o( g/ p; g } catch (Exception e) {4 d2 T( r2 G0 z& p2 h
System.err.println ("Exception stepRule: " + e.getMessage ());6 `4 T% P8 O5 J5 n# V6 d" P
}
2 c2 y% F# c+ `
$ j) r6 S! J F+ ^ try {
% g& h; y3 t# Z3 q5 i) G) R, C Q. R: q Heatbug proto = (Heatbug) heatbugList.get (0);: Q3 j1 J3 T1 a; x5 `4 ?& d
Selector sel = / v) ~$ t! |' t" L; c7 P- _8 z+ d3 X
new Selector (proto.getClass (), "heatbugStep", false);2 p. A8 t6 ?! e9 A7 P' c
actionForEach = J" F' S' f* J7 p- Z: A
modelActions.createFActionForEachHomogeneous$call
! z7 [: u+ t- X* H! [7 N( ^. ? (heatbugList,
/ L; T9 s: A2 ^5 ^/ l1 {4 p2 j new FCallImpl (this, proto, sel,
) `( w0 t0 x2 z new FArgumentsImpl (this, sel)));/ h0 Q# v3 z& S/ U F
} catch (Exception e) {& y2 s! r m7 G
e.printStackTrace (System.err);: X3 X& l1 w1 V% Q8 w; U
}4 v/ ]% i, w: Z0 _1 s" Q
0 e# N; l' n4 {1 z& Y) x/ ?+ q6 }
syncUpdateOrder ();
% K% x' G5 ?! U6 N
, j# {! r5 F% p# N! o try {
) M& |6 {7 S( r# m$ U( w modelActions.createActionTo$message / O0 v# q7 J: e3 T8 `; n4 j2 O
(heat, new Selector (heat.getClass (), "updateLattice", false));
1 o" R5 q; i6 C8 y* Q3 g3 p1 r } catch (Exception e) {- H1 [6 c- T: n6 D6 W" u7 y- o! H
System.err.println("Exception updateLattice: " + e.getMessage ());
8 W$ y7 v. e/ [# S8 a `# f }: t( H8 L3 [ B& |& Q* ]
! G0 P# {. b- k( L) j# |! D // Then we create a schedule that executes the
3 U* r+ H6 z3 r: \: b; ]9 p // modelActions. modelActions is an ActionGroup, by itself it
6 o! f' g9 ^3 D // has no notion of time. In order to have it executed in
$ r' a* g+ ?9 G }3 x // time, we create a Schedule that says to use the- o D% r' t$ T! J$ ^
// modelActions ActionGroup at particular times. This
( R& n* s5 U/ d0 W, p/ o( Z // schedule has a repeat interval of 1, it will loop every
" q: O+ i+ b; X3 T- y3 E' w8 k' N( _. K // time step. The action is executed at time 0 relative to$ A2 f9 W( p9 ~
// the beginning of the loop.
0 j n$ b7 B' Z) B
$ o) G8 X4 v- `1 W* ^ // This is a simple schedule, with only one action that is
q* k& @6 _7 n) k% M8 M8 J // just repeated every time. See jmousetrap for more
9 V1 n* {4 V. H+ ]) w: k* ^3 c // complicated schedules.
6 k/ g7 E4 r8 Z: E/ v
$ E# R( ]+ p# h, a- L3 ]# C modelSchedule = new ScheduleImpl (getZone (), 1);
: M' k6 N/ B; Z% A6 D2 K- v$ }9 v modelSchedule.at$createAction (0, modelActions);
" a3 u# `7 K8 z* a
2 U3 d/ i3 A% V3 M return this;
5 z( r8 D! k0 E. V } |