HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
( u0 h( j' y* C8 W) r7 W3 `8 v+ T% h6 F& q! x$ e+ ~+ V
public Object buildActions () {7 |, P2 b4 x" I0 P
super.buildActions();
' k- N" o7 O" g
8 ^1 | ~3 M2 N/ C# f4 ?1 T // Create the list of simulation actions. We put these in
3 G( I, Z' p0 ?6 {7 U! i: x // an action group, because we want these actions to be
: P Y3 K0 f5 h, J // executed in a specific order, but these steps should, [: X1 \) W4 L' {2 S+ H$ Y
// take no (simulated) time. The M(foo) means "The message3 n. J: m# @( n) W
// called <foo>". You can send a message To a particular6 u: l' D, T/ m+ e' H3 p" K
// object, or ForEach object in a collection.
- R* O. z2 |4 \0 w
0 Q. \2 |1 U" H3 D1 I // Note we update the heatspace in two phases: first run
) O! [& o7 ^: z" R8 ~ U // diffusion, then run "updateWorld" to actually enact the' F# o0 J: w$ g! Y7 O
// changes the heatbugs have made. The ordering here is8 e$ J4 j1 z F L7 a- r9 g
// significant!5 P* B p. \, P; s1 ^
1 t9 P, u' r0 ?; p; A7 }5 m1 k // Note also, that with the additional1 j# P- y8 D. u) J2 h
// `randomizeHeatbugUpdateOrder' Boolean flag we can
9 f; C( D, I2 H6 }) ?! E9 W5 e, t$ R // randomize the order in which the bugs actually run
. x8 y7 b% ~+ I [$ ?" h) l, \& i // their step rule. This has the effect of removing any
8 ]2 V# I) g/ R+ k# u) X // systematic bias in the iteration throught the heatbug3 A+ j& p9 `7 J9 \
// list from timestep to timestep
$ M0 Z; k4 h7 X9 u( U , x$ z1 Q' m2 \! B( v
// By default, all `createActionForEach' modelActions have H+ a! U3 t$ P8 t* G% y5 r/ G
// a default order of `Sequential', which means that the
% }0 x: p& f. Y% m // order of iteration through the `heatbugList' will be
9 H4 ]: g$ c' H$ ]: f h% H // identical (assuming the list order is not changed
$ Z% d+ G, z4 ^ // indirectly by some other process).6 |% L$ A2 V: ?9 q$ u( \1 G6 Z
) j% d. Q) Q n, n6 N# ?) H modelActions = new ActionGroupImpl (getZone ());( P5 M# }# ~7 x7 j2 B
! b0 j. C) ]7 y) k try {% l; {. p* G& S! l' s+ F& T S; s
modelActions.createActionTo$message
8 u- f) H6 a0 H6 y (heat, new Selector (heat.getClass (), "stepRule", false));
0 C9 [) `+ Z8 S, a% ?+ |4 F } catch (Exception e) {* T! P4 R+ ?- ~: a* y: V
System.err.println ("Exception stepRule: " + e.getMessage ());/ O. Y9 Y* p- g q5 j$ I0 K
}7 n/ h$ [) T0 z
0 i; Q/ p" n; k
try {9 Z) \( I* i" r; e2 ?
Heatbug proto = (Heatbug) heatbugList.get (0);$ N K5 R3 L% h9 C/ [
Selector sel =
( X2 x0 y. C8 N4 ?6 Z new Selector (proto.getClass (), "heatbugStep", false);, K) R6 b" b/ z! r8 K
actionForEach =
' H3 a# o& ~8 e modelActions.createFActionForEachHomogeneous$call
! K* }) F8 |- ] (heatbugList,( ?- z/ U% d' J# @: M, F
new FCallImpl (this, proto, sel,( d! f. @+ i* }$ T
new FArgumentsImpl (this, sel)));
+ T9 ?! c: `8 \% I% {6 M. S } catch (Exception e) {
# t( f- g& ? g# T5 {# J e.printStackTrace (System.err);* m1 L5 Z% j: F
}" a! m; [" v5 R* u. l
5 t0 Y& K/ _4 n' e& O" m syncUpdateOrder ();& |" S0 D" z% e
: t4 Q q6 R( H3 ?
try {
6 e: @$ t3 A' X6 b1 e+ x modelActions.createActionTo$message 4 _. m0 s c2 W2 }
(heat, new Selector (heat.getClass (), "updateLattice", false));4 M, }. y4 M! q$ { W& D6 q6 A1 G
} catch (Exception e) {
! |" R& \' E; e( ] System.err.println("Exception updateLattice: " + e.getMessage ());! _# F' K# O# n. \7 S
} v% g* k& P: e3 o1 O8 N3 d
9 R% R$ ]& T. L, i% g" k0 M: N // Then we create a schedule that executes the5 |" D9 t- _/ }6 Q, D) y
// modelActions. modelActions is an ActionGroup, by itself it0 U. b B$ r g3 Z
// has no notion of time. In order to have it executed in
! F! \+ v* Y; t0 t) ^# S // time, we create a Schedule that says to use the
% m) E& q6 P. b$ {% i // modelActions ActionGroup at particular times. This5 l5 `- H" S# l7 Q9 j! W+ J
// schedule has a repeat interval of 1, it will loop every
/ d4 p7 e, P9 R6 m9 ` // time step. The action is executed at time 0 relative to$ u1 Z5 j& D' p0 }( P
// the beginning of the loop.
f- E. V+ r# b% B) L: N* @9 J: [( D3 p! U0 v5 L
// This is a simple schedule, with only one action that is
( w s7 c6 Q% v4 y4 | // just repeated every time. See jmousetrap for more1 Z1 T7 R0 V; E# O+ ]6 Z# }0 b
// complicated schedules.
( ]+ H8 w- m+ M/ B5 ^" D7 b& ^ 1 l' o3 ^9 u7 { t0 y
modelSchedule = new ScheduleImpl (getZone (), 1);- I p' r; p7 g* {/ M
modelSchedule.at$createAction (0, modelActions);. [2 [& O* o! k7 v/ T1 U
6 p9 r" T# F7 V! x8 c: A return this;
& I, x! u0 W$ D; n6 ` } |