HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:+ e. E" a6 N8 a& G% Z; g* X
- L$ L- w. J1 x4 x! v1 O public Object buildActions () {
& ?% Q# w! }' S' m) [( ^3 ?: N super.buildActions();
, r( ]4 `3 U1 [6 ^' T: j3 v1 | : g+ D8 \# ~2 n1 O' ~. ~0 @3 x# z
// Create the list of simulation actions. We put these in1 A9 M1 _9 G' q' o( \
// an action group, because we want these actions to be
: H$ y& h: c: I3 k // executed in a specific order, but these steps should/ N# r) I2 i9 A( p% u
// take no (simulated) time. The M(foo) means "The message B7 e6 @+ }5 g* C- m0 `' \# R7 H. S
// called <foo>". You can send a message To a particular/ _2 ^! F$ d5 X4 v* b3 P
// object, or ForEach object in a collection.2 d) {2 t" Y& C* |$ ]9 W: H# O- l
% T' L; S" I' y1 ]# Q: U4 M // Note we update the heatspace in two phases: first run J1 E, i8 B% H, `
// diffusion, then run "updateWorld" to actually enact the0 o) p M6 X1 g d3 E
// changes the heatbugs have made. The ordering here is; ^. u# m/ c8 j9 z
// significant!* m6 { c1 [7 M* d" `
; h4 R& s* P* n3 g7 `
// Note also, that with the additional- \0 ~5 r1 M4 {; G& h: g$ D! f
// `randomizeHeatbugUpdateOrder' Boolean flag we can
1 I) R. q* J8 j" k // randomize the order in which the bugs actually run. z* P) C) M# m9 j' S+ A
// their step rule. This has the effect of removing any
! h$ l9 _, Y7 N7 l1 T // systematic bias in the iteration throught the heatbug
5 g4 Z; R- C9 _+ h/ Q1 A* x& u, X // list from timestep to timestep1 v/ F6 E: \8 I
! s. o; B- s" d
// By default, all `createActionForEach' modelActions have
. i& J5 N& r4 l // a default order of `Sequential', which means that the$ B+ e0 L7 K( ?: ]3 m
// order of iteration through the `heatbugList' will be
9 D; L$ @- v0 s( @ // identical (assuming the list order is not changed, L |7 K0 b3 F* I0 `8 u g
// indirectly by some other process).2 v8 K5 J6 T/ C/ `1 l3 L
) K5 j2 E A: f% O+ ~4 E- E" j
modelActions = new ActionGroupImpl (getZone ());" ~: L/ V! w- e. N% }
# L; w- b& H* R( L3 |& p1 U
try {! {/ h a4 w& a/ _
modelActions.createActionTo$message- j- Y3 P& v) K' [
(heat, new Selector (heat.getClass (), "stepRule", false));
9 D* u( Z3 V9 {8 r8 _. M+ A } catch (Exception e) {
& ^ h5 T" E6 v* p7 B- J& X; | System.err.println ("Exception stepRule: " + e.getMessage ());9 V* ?6 F. C+ ?# m! S/ U
}, [$ a7 Q1 ?* t- H! {
' W6 H+ x; k' g9 J6 O! A/ h; K3 h& E
try {
/ g0 c: a" I6 \5 M6 C8 A* X/ |4 ~ Heatbug proto = (Heatbug) heatbugList.get (0);
8 p# g9 n& D- M8 @% P& u Selector sel = 7 y3 q$ T: Z0 h8 w+ Y' L" b0 ^
new Selector (proto.getClass (), "heatbugStep", false); t- Z% P* N$ u0 r$ w' X9 M
actionForEach =
9 R7 B, O1 u- E9 k6 Z/ U: E! | modelActions.createFActionForEachHomogeneous$call
$ C$ ^1 A' K3 K+ {& c: Z6 I2 l (heatbugList,
3 r" |9 a8 d3 z9 R% Q. C, S new FCallImpl (this, proto, sel,
" R- r: C/ u- Y4 \3 O new FArgumentsImpl (this, sel)));
/ e9 G5 S: d6 E5 O. I) O } catch (Exception e) {
% y# c: i p1 I4 m# m- y4 ?' u e.printStackTrace (System.err);$ p6 d- m7 Q6 e" X& e2 D0 p
}
O& P( Y" E; C! c
$ o4 X) E& x0 L; }8 K9 p" M) O syncUpdateOrder ();
7 H- u$ p& V- }! G
K0 d6 a, ?. G: \1 g- g try {
" Y9 O1 B$ M0 ~7 n modelActions.createActionTo$message
* g% N5 ]: l2 y m T" L/ v (heat, new Selector (heat.getClass (), "updateLattice", false));% x* v# \2 f+ ^+ E. r/ i4 X9 M
} catch (Exception e) {
5 t u3 s4 H" d* |# g( l" U System.err.println("Exception updateLattice: " + e.getMessage ());+ Z. u" i# o! p) w- P
}. w. P- p: C. j9 ^5 j
' J; T# k; _+ \6 x6 Q, i4 e // Then we create a schedule that executes the. C" ?& M) a J0 u
// modelActions. modelActions is an ActionGroup, by itself it5 H% J# Y2 v9 \8 i
// has no notion of time. In order to have it executed in8 |' q7 f# J- a' R4 M I
// time, we create a Schedule that says to use the
K) M: G# j: ~* L* J$ F2 U // modelActions ActionGroup at particular times. This
4 k1 L: U' i4 v. M; T // schedule has a repeat interval of 1, it will loop every; a. X' _& y: \ v, G% C$ c
// time step. The action is executed at time 0 relative to+ ?+ F& k6 e; c
// the beginning of the loop.
5 A0 T# P0 _0 L$ X$ \, n0 b; f# _! K! Q& m* o( r
// This is a simple schedule, with only one action that is/ K9 u9 _& Z1 A2 k1 b
// just repeated every time. See jmousetrap for more2 D" T+ {) S7 l Z+ `
// complicated schedules.
( Q5 }7 c6 u2 x( [6 F! |; Y( \! s0 G
, X7 b/ t" g Z9 F7 M modelSchedule = new ScheduleImpl (getZone (), 1);. U+ N0 ?( y7 P- N; X
modelSchedule.at$createAction (0, modelActions);) A* d" `* t" S( V
6 O8 i# P3 E0 a A% R( t2 a0 M, @6 K return this;2 b! l& N' m8 b7 a7 ^' ]
} |