HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
, C! ~* Y1 `/ F& n+ O, B8 d2 e! S6 c" E
public Object buildActions () {
/ W' N; M# [& s0 a0 L) Q super.buildActions();
; G) E# f/ \) I2 a% ~6 H ' K8 w0 ^ L! {( L5 t
// Create the list of simulation actions. We put these in1 Z! `7 Y& r. F3 t0 x/ P9 M! t4 H k' J* @
// an action group, because we want these actions to be) n3 J2 O$ ?$ M. d: N9 W( z
// executed in a specific order, but these steps should
) e/ M# u7 V: \; i6 L2 } // take no (simulated) time. The M(foo) means "The message
- T& N V$ A! Y) D- E+ \/ N6 B' x // called <foo>". You can send a message To a particular
/ L& @6 r$ f* ]8 E // object, or ForEach object in a collection.+ n0 M' [0 `& x1 w% l
: t m; w" m- n4 C. _
// Note we update the heatspace in two phases: first run
! R O: X0 C5 y: x // diffusion, then run "updateWorld" to actually enact the
! ^) t* y# a$ F6 b6 P0 k3 u // changes the heatbugs have made. The ordering here is- c3 e5 @3 g! i& Z1 M
// significant!
( u7 {. A9 F5 U4 [# T3 A
! b4 b$ ~3 z+ A // Note also, that with the additional
& Q$ ~! D: Z8 k+ K8 ]& U, }: a // `randomizeHeatbugUpdateOrder' Boolean flag we can! F! \) i/ K7 J) @* d9 c- i
// randomize the order in which the bugs actually run, U5 Q$ ?: E! N6 ?
// their step rule. This has the effect of removing any
: @8 |/ r& D- z1 | // systematic bias in the iteration throught the heatbug( I! x* `* G! U* D- u5 y
// list from timestep to timestep
% _ i% X; R3 _. _; f) s* w
! i4 V' x G9 S; ? // By default, all `createActionForEach' modelActions have# C+ I- b5 B% g9 J' a" _& E
// a default order of `Sequential', which means that the! ]2 \0 Q/ l6 Y1 l: _
// order of iteration through the `heatbugList' will be
+ U& n$ u/ O( L* s; q0 ?! Y: z // identical (assuming the list order is not changed
6 z6 o, E# v4 z- P* F6 ? // indirectly by some other process).% ?- r; M6 ?0 {
/ p7 ]8 }+ E8 _( H4 d; }- o modelActions = new ActionGroupImpl (getZone ());
. ?' L5 ~. m# D! t+ a% r6 I# s9 I" Y; F2 m% T B1 @$ C" T" F
try {; g' \ z, [& ^ p5 f
modelActions.createActionTo$message4 p5 m- g) H0 A, Z
(heat, new Selector (heat.getClass (), "stepRule", false));3 V* U* s. [; M2 e0 T
} catch (Exception e) {( C, M1 {8 V8 L/ [- e- h; ?
System.err.println ("Exception stepRule: " + e.getMessage ());: X: T$ _/ y1 j
}, W ^- w% j1 N# ]0 J
0 E' K! P+ v2 G6 U5 m& \
try {+ ?4 ~" p4 _ n; F6 }2 @' |
Heatbug proto = (Heatbug) heatbugList.get (0);6 z* ]" N3 v4 n2 [8 A
Selector sel = 3 n) G! x% z4 [' L* G& Z
new Selector (proto.getClass (), "heatbugStep", false); q' `: E" r) Y: R
actionForEach =' ^2 ]+ S% ]5 g# i+ }1 h) J
modelActions.createFActionForEachHomogeneous$call6 H8 m, ~5 L# J
(heatbugList,+ G- ~6 y* N8 v, J2 D
new FCallImpl (this, proto, sel,
8 n: ^! S9 C& G; I7 u) ] new FArgumentsImpl (this, sel)));2 J! n1 D: N$ O9 e3 Q3 a
} catch (Exception e) {
% F+ m0 y% C+ K( N e.printStackTrace (System.err);9 S* c% c$ ^9 v) c& f' ]
}
& b1 p& y9 n, M# Z; I 2 i! N. n% n7 ?+ l4 ?
syncUpdateOrder ();
; Q4 R$ ^- z8 i1 p: d5 V
8 k. T! d6 |" `' l: z+ r' t- E try {% E# ]+ c: s4 L7 l* K# z
modelActions.createActionTo$message
8 t) k3 o7 D; |2 A+ v$ ~/ H( o (heat, new Selector (heat.getClass (), "updateLattice", false));- r. W/ @$ H- ^1 }
} catch (Exception e) {8 R& r/ M# H0 `$ M% l& }: ^
System.err.println("Exception updateLattice: " + e.getMessage ());2 r6 f4 B: V& v8 V5 p: u; K
}
8 Z' V2 w, _$ p R! l4 O+ B
% U* E0 C z7 r* a1 ^; W // Then we create a schedule that executes the
% b9 t8 N6 r: I0 W. b" Q3 P1 }- \ // modelActions. modelActions is an ActionGroup, by itself it
9 q; S1 r7 V; q! E% @ // has no notion of time. In order to have it executed in6 m- g# V% Y& Q5 C. D1 I+ q) O
// time, we create a Schedule that says to use the
* y% }6 R/ Q0 p3 \8 I // modelActions ActionGroup at particular times. This
% s0 v+ ^- I+ q& R& E // schedule has a repeat interval of 1, it will loop every5 T5 e( h; e! X
// time step. The action is executed at time 0 relative to
) H4 _- Y+ L* \8 J. X" o // the beginning of the loop.
3 M/ J; |1 @( e% e( ^; q) y. U; ]
/ V8 G6 U0 d/ x6 o // This is a simple schedule, with only one action that is! L2 `% b0 |3 i% I4 \
// just repeated every time. See jmousetrap for more' Y+ o. [9 @6 U+ L
// complicated schedules.
" d8 ^8 _2 A6 c7 ~6 Y( w5 ^ 6 E+ K( D" s r+ P1 i3 }0 F
modelSchedule = new ScheduleImpl (getZone (), 1);0 \2 S7 @) \& T5 r. T
modelSchedule.at$createAction (0, modelActions);8 K1 {6 H0 v7 N+ e% V; O' \ q
" E) V& }9 o& C7 s3 W return this;" p7 P1 ?% Y! B: I2 u
} |