HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
" r* N* f4 c4 L4 X1 _% u5 v% j* d7 D$ b( F/ U- S/ `6 n
public Object buildActions () {
- s4 W) a9 J4 Y1 V$ {: h super.buildActions();
$ Y4 ^% q8 H, e/ f7 r/ t& L" x ) I! u0 w9 Q. x* M3 j0 g+ W
// Create the list of simulation actions. We put these in! Y$ a% ^$ V4 A" ]( w, o
// an action group, because we want these actions to be
1 y$ Q6 B: o% e( w: m7 B1 ] // executed in a specific order, but these steps should& ^% V0 r2 I `+ p
// take no (simulated) time. The M(foo) means "The message5 ~2 l. ^8 R F; I6 @
// called <foo>". You can send a message To a particular4 i' A) E0 v- S: G# h" y. ]
// object, or ForEach object in a collection.* n+ O0 N0 q# v. ~8 y# o4 g" Z& m
9 x; D0 B/ X, D: P+ X // Note we update the heatspace in two phases: first run
* t5 t1 |% q& M! a1 ?8 C. B p, ^ // diffusion, then run "updateWorld" to actually enact the
- b: n$ B# i' M7 U9 Z" g ^ // changes the heatbugs have made. The ordering here is" I! o) _; \, [/ A$ Z
// significant! F2 ]. m0 ?" Y/ }" x9 `
0 M% s' P" t$ [/ F* ~/ |7 @" \8 z
// Note also, that with the additional3 S- u, Y) M* F/ W! V
// `randomizeHeatbugUpdateOrder' Boolean flag we can* \0 [+ S0 G, Y* R& i
// randomize the order in which the bugs actually run
, y! k0 q" f: K // their step rule. This has the effect of removing any
: n1 q$ ~) \; N // systematic bias in the iteration throught the heatbug1 T5 a1 N. H9 ]- f% w
// list from timestep to timestep- X* J+ N& }6 P; u% ^
+ N* t9 s5 W4 [9 E4 V
// By default, all `createActionForEach' modelActions have) v. q& x+ N7 Q1 Y; s4 o* ?+ r
// a default order of `Sequential', which means that the2 l; Y* z+ P, V; D4 P: L2 T& z
// order of iteration through the `heatbugList' will be
5 n- } L$ b7 P // identical (assuming the list order is not changed
* F; B* L& s& U2 T+ y" X9 x // indirectly by some other process).
2 j+ L1 Q9 x2 ?' ]5 S ! f5 [4 u) p( k/ ~( E' B
modelActions = new ActionGroupImpl (getZone ());" _& T, `' `" ^" _ m9 h9 r$ u' G6 r
/ i) O' Y& v; m* W% t% n
try {( C$ h8 h1 _, T" P) v/ @
modelActions.createActionTo$message2 Z H& [$ V* k& E
(heat, new Selector (heat.getClass (), "stepRule", false));
7 ]8 V& D% M. `4 l } catch (Exception e) {8 ^6 ~+ c! P. D. k7 K$ a! R
System.err.println ("Exception stepRule: " + e.getMessage ());1 j, ~7 j& J* q$ R# Q1 K% G
}' l& T1 x+ p& U
5 n5 F! J* ]. \: i+ F' |9 Y% M
try {" V8 N7 p5 O4 t$ j
Heatbug proto = (Heatbug) heatbugList.get (0);+ c0 x% n) o: D" \1 h; c
Selector sel = ( z8 {/ y6 P6 Y4 Y9 o
new Selector (proto.getClass (), "heatbugStep", false);3 D9 J, ~& v/ e$ d' ]
actionForEach =
* X; Y9 W6 B- R modelActions.createFActionForEachHomogeneous$call
' [4 `/ r5 D; b1 E/ V (heatbugList,! A# ^1 i) U" a) o: {
new FCallImpl (this, proto, sel,; x" a" ]- Z/ f: a9 w+ ]% D+ m
new FArgumentsImpl (this, sel)));; T& B, n8 b0 r6 \3 z- w9 S
} catch (Exception e) {
H/ L; F, J( Z4 S) x$ \$ d$ o8 l e.printStackTrace (System.err);; j4 h8 |7 A4 {0 e5 S) ^
}# M8 u! M5 u" o% }& u# ^
5 {' x: r, g, V* o# N, }% } syncUpdateOrder ();
( M% b+ _( P8 w9 Y2 \4 M$ z& |
- e* ]! }+ c2 z: t! U try {4 u; x/ z8 z' \* g T8 Q8 y: R; i* r6 }
modelActions.createActionTo$message $ s9 O" D6 Q; ~# O4 q0 x& }1 w- W
(heat, new Selector (heat.getClass (), "updateLattice", false));
9 n' E* O4 d0 k& y ?7 D% Z } catch (Exception e) {6 k! O2 G# _" T
System.err.println("Exception updateLattice: " + e.getMessage ());2 w5 A! B$ ?! [) o2 R2 U: Z
}. Y2 f" I2 B, ^. A1 b; i+ K
3 ?9 T3 N8 o+ O: U; {! F! } W ^) H# }
// Then we create a schedule that executes the/ U R. I1 [5 g3 m2 M' }9 ?
// modelActions. modelActions is an ActionGroup, by itself it+ |+ g# {9 G; S+ N
// has no notion of time. In order to have it executed in
8 m% t) i! h( d9 P) {! @ // time, we create a Schedule that says to use the
" g2 j! [3 ~- P2 ^" r0 N0 B8 i5 X" s // modelActions ActionGroup at particular times. This
! `$ b W/ i7 G4 U* R* q' \' f // schedule has a repeat interval of 1, it will loop every7 ]! u1 ]5 Q" @9 h
// time step. The action is executed at time 0 relative to
) ~" y" c! X u' _, T, f // the beginning of the loop.; k5 U- V$ @0 u) [* M; v
- z8 I. U6 C3 U; Y% F" E8 e
// This is a simple schedule, with only one action that is" V) \. X$ I- y7 c; y
// just repeated every time. See jmousetrap for more
# f/ G* q5 V( `) z: P // complicated schedules.
9 M' T9 }+ a- | E* K+ n, Y7 z, j% |. z
modelSchedule = new ScheduleImpl (getZone (), 1);' H/ _9 Q5 t7 J
modelSchedule.at$createAction (0, modelActions);3 h, {9 b4 Q- |. L/ V) g- A
+ I$ [# |- e8 N8 r) e% P* v* d
return this;
. k5 L1 J; J7 i5 h5 U, L Z0 ? } |