HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:6 F* A$ D/ U* ]1 T# h1 I5 q
+ o$ o- b* L: ?9 J0 _4 q8 P. I) r
public Object buildActions () {
/ m# m: R: D/ ?6 n3 J super.buildActions();
: N& K* [4 ~6 X
- c0 m& C: `5 n0 x3 N: _ // Create the list of simulation actions. We put these in
. L4 j; I, q! L. ?; I7 a3 D; _ // an action group, because we want these actions to be
A) M: Z# X0 _' i // executed in a specific order, but these steps should
1 L+ I& W" d; y" I* {+ a5 h$ ] // take no (simulated) time. The M(foo) means "The message5 F- @3 K8 l U+ h/ @% R
// called <foo>". You can send a message To a particular2 P$ v, a4 E9 A% f0 z: g/ r4 n, T
// object, or ForEach object in a collection.
" f( ?, f! C* J* I ' R8 P L! C7 e- ]! U
// Note we update the heatspace in two phases: first run
% S6 s2 E$ I8 A( J0 X // diffusion, then run "updateWorld" to actually enact the8 |$ \/ p. U9 c3 W |! u
// changes the heatbugs have made. The ordering here is
8 g0 m4 \- {; O( U // significant!
$ ?6 g+ \5 y1 P+ l6 I4 U" ?* S 9 N" B2 x+ p1 m j3 p1 y
// Note also, that with the additional4 P/ i$ L" q# [# r. h" x* Y
// `randomizeHeatbugUpdateOrder' Boolean flag we can% ]9 E8 b4 L( j$ b0 X4 ~+ Z9 j
// randomize the order in which the bugs actually run
! o) w0 Q" ~* e- s1 h) Z // their step rule. This has the effect of removing any
, F( ~9 N: h1 h5 E // systematic bias in the iteration throught the heatbug8 B4 `4 i0 K" G" ~, p1 K, ]# F
// list from timestep to timestep
* M9 G9 W0 Y5 ?: d& w+ O2 I2 P 6 g8 P. R5 v0 p
// By default, all `createActionForEach' modelActions have
5 }9 R2 K7 e$ m% t4 ~; q. C& i7 F // a default order of `Sequential', which means that the8 n" d( |0 Y: b2 l% p; { j* i
// order of iteration through the `heatbugList' will be
* x6 @2 X: A/ H% b // identical (assuming the list order is not changed
8 K* E3 C. A. E* X$ U // indirectly by some other process).
- }% n7 a+ A2 ^5 E) i3 z5 Z ' n. Q; ~7 m& ~" ^8 u8 f# |
modelActions = new ActionGroupImpl (getZone ());
0 ]2 w0 z! O' e" b/ r
( k. H3 |1 _0 d6 L try {
/ V D/ f$ A9 \9 e modelActions.createActionTo$message
+ O( |# I& m" ^ (heat, new Selector (heat.getClass (), "stepRule", false));
$ u7 P1 V6 D/ c& N } catch (Exception e) {1 g1 C3 Z; b1 V7 K% c; Q7 c
System.err.println ("Exception stepRule: " + e.getMessage ());
9 x0 K( [% W2 k- U }
3 \1 [7 g U6 ^9 c- Q
% E" g3 `1 A$ C9 e3 J$ s m1 J9 X4 B" D try {
8 g4 ?. m. |8 T4 Y% q& o1 ?% P Heatbug proto = (Heatbug) heatbugList.get (0);
( R' P3 @- { Y: }8 E1 L7 J' H/ z Selector sel =
" m5 {/ q' y2 V O- i( q new Selector (proto.getClass (), "heatbugStep", false);1 ^' ?" N4 U- n d6 ?) L
actionForEach =
: k2 r6 D. |: s7 j& }0 [2 E modelActions.createFActionForEachHomogeneous$call
" o5 J% }: w% \6 a+ F (heatbugList,
" Y, {# `$ @8 x; D# h new FCallImpl (this, proto, sel,
" ^0 U3 I5 ?) B' G new FArgumentsImpl (this, sel)));+ |) {! i; Y& ~& p4 Y5 d
} catch (Exception e) {0 g% ~1 z! I* c/ `7 k3 `' e
e.printStackTrace (System.err);2 Y% s1 x; F; D% |" d2 `
}2 B& p' o! ~4 K$ c
6 S& g" l0 ]* i' q syncUpdateOrder ();' U3 ]8 W' J% Y. }, }
3 E4 S* M/ p2 p: t6 S
try {
2 z! G7 O8 ]4 j" A& X/ l( A modelActions.createActionTo$message 6 E& H- i4 y3 X p( Z1 e p
(heat, new Selector (heat.getClass (), "updateLattice", false));
. X3 @' W$ }, k } catch (Exception e) {
! ?) Z2 x( A7 O1 V System.err.println("Exception updateLattice: " + e.getMessage ());
2 K7 v9 e* y1 A' ?6 C" o }
' k. N% E6 X( j/ g7 q
$ a& I# @9 `1 J // Then we create a schedule that executes the# |! n5 i/ u! T l A, v; m( C! o
// modelActions. modelActions is an ActionGroup, by itself it. Z& x v, z# O! c
// has no notion of time. In order to have it executed in
% z0 ] l* T& a" r6 F // time, we create a Schedule that says to use the% Z' t5 C0 z. |$ i D0 {
// modelActions ActionGroup at particular times. This
/ L; f& w z1 e" V' y' ?( B1 ` // schedule has a repeat interval of 1, it will loop every( k! x# k4 O5 O& _; ^
// time step. The action is executed at time 0 relative to& Z1 A+ O' g0 ?. Z
// the beginning of the loop.( M' J! R& J) e8 t( N
. `8 s* p7 \! m9 u" R0 p; c: s // This is a simple schedule, with only one action that is
. ^5 M9 \/ a- W8 {8 S7 E // just repeated every time. See jmousetrap for more
( o( \8 Z0 S0 U3 ]% |3 a' A // complicated schedules.
/ b, v% j$ K6 W% @1 k! [ * v. l2 Z3 y* K4 q; b
modelSchedule = new ScheduleImpl (getZone (), 1);5 n8 ^( @$ P- A% b- I2 \
modelSchedule.at$createAction (0, modelActions);
7 @2 D( e0 ] u" q$ A. ^
. [! W- Z2 s; X( n; b% H return this;
9 j8 k3 U2 @5 t8 v" g! v1 U } |