HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
* @+ j! s2 o2 A/ M" L7 z& a. \& }9 S& D, v; d) ^7 @) L, v. z- }: s
public Object buildActions () {/ I' ^: a, Y( s0 V
super.buildActions();
# b8 c0 @: a( p! ? 9 Z# ^. }4 m, @
// Create the list of simulation actions. We put these in* w$ K& L6 a, R4 g
// an action group, because we want these actions to be; P5 F2 g- i, @, I
// executed in a specific order, but these steps should$ j( Y' V1 b/ Y$ I2 s- Z, L! A4 E
// take no (simulated) time. The M(foo) means "The message' y8 v" X& p+ M% H2 l
// called <foo>". You can send a message To a particular
" s: @% r1 l& `$ x // object, or ForEach object in a collection.
! o, W7 k- M [/ V/ O
) X7 Z; }) R( X) j& o; ~+ Q // Note we update the heatspace in two phases: first run
K( v# m+ E' n1 L8 V3 O6 ^ // diffusion, then run "updateWorld" to actually enact the5 W3 M2 c8 \+ V9 U! H: p8 D$ t8 h
// changes the heatbugs have made. The ordering here is) I$ G0 E& \, h/ d/ V. D5 d
// significant!
( @+ Y* }6 C. G8 t. r% m& @ 4 m! s$ P d9 _' c/ n
// Note also, that with the additional
, q) s3 w. q; y j6 _ // `randomizeHeatbugUpdateOrder' Boolean flag we can
# J" T% D7 c% F0 ]. M5 G // randomize the order in which the bugs actually run
# ~# l4 p# J% Q! ^ // their step rule. This has the effect of removing any
4 [# y6 a1 E- D, |/ W" Z // systematic bias in the iteration throught the heatbug( }$ S# `$ P9 Y: O
// list from timestep to timestep0 \+ g$ ^, @7 K( ^
/ n1 Q& l! a! K+ w$ v // By default, all `createActionForEach' modelActions have# F( m. e/ p5 Z% _* Z" I
// a default order of `Sequential', which means that the
! v! P. S1 r9 o* ] // order of iteration through the `heatbugList' will be. k; V' U+ o' s
// identical (assuming the list order is not changed: I% p; g L. k
// indirectly by some other process).
( P' B' ]2 ], U) t+ V- Z- g
2 U2 Y. L- i1 K# h+ X8 V& T9 U modelActions = new ActionGroupImpl (getZone ());2 L- W" t2 o; H" j- f' A a
5 t ^/ L- F8 K) n# b9 K: A1 y
try {& F" G8 `$ q: e2 M: ?
modelActions.createActionTo$message
. w6 q8 E5 |- W (heat, new Selector (heat.getClass (), "stepRule", false));
% y4 h/ K V; V- ]' }: C1 i5 r } catch (Exception e) {8 m; M" p- \0 g4 r& l9 ?9 \
System.err.println ("Exception stepRule: " + e.getMessage ());
" m! O1 V* a6 w( x }
& r& n. w D) f, J% x# K* T+ ]1 J# c7 [
try {
( k* ?# P6 Q! v" o2 _. P8 p8 I) k Heatbug proto = (Heatbug) heatbugList.get (0);
6 a6 k3 O" A4 s% c Selector sel = * g s, }! M+ m
new Selector (proto.getClass (), "heatbugStep", false);
9 p9 q$ P. X3 {$ }4 ~" U5 f& j actionForEach =
+ |8 e2 f2 C( u modelActions.createFActionForEachHomogeneous$call) w9 ~" Q' Z2 L
(heatbugList,
; Z, ]4 ~3 R& O new FCallImpl (this, proto, sel,* S8 u% s, a- l
new FArgumentsImpl (this, sel)));+ |" S3 z. a0 ?5 [5 f) o) E# T$ }
} catch (Exception e) {8 \0 I. r5 ]2 c
e.printStackTrace (System.err);
* [% Y# u$ B# C2 @7 U% X# B }4 W! m7 K" M2 p1 M" K2 D
( A$ f# t" Y6 b4 G3 _# ?. ^# N6 Q, v d syncUpdateOrder ();$ H, |. t! q- N7 I5 f# E* c
1 `+ a' X0 ]+ m1 }
try {! b7 \5 `$ R5 z. T6 d! t2 {
modelActions.createActionTo$message & `, t- I) J+ \, ]0 n2 c t* B
(heat, new Selector (heat.getClass (), "updateLattice", false));
. e3 l# P- k2 Q1 t9 U0 L; ~8 k5 d) _ } catch (Exception e) {
* H* z9 f" s2 v4 N1 [: j System.err.println("Exception updateLattice: " + e.getMessage ());' ~. O# C3 _0 X+ Z& V, e
}. S7 d/ r3 R8 R
K; p. s5 M8 @. a/ V. |$ H9 a
// Then we create a schedule that executes the, P0 e& `8 U; n, Z" X
// modelActions. modelActions is an ActionGroup, by itself it
2 s2 J1 J; z0 q0 I) Z# E" W' c // has no notion of time. In order to have it executed in" s" O, g* M) ~* L0 ^& D) A
// time, we create a Schedule that says to use the+ E) P7 l3 i5 z6 \# A1 N# S
// modelActions ActionGroup at particular times. This
; Z, @) R x5 Y! u8 ~' r$ X // schedule has a repeat interval of 1, it will loop every
- b [! N" W+ X: r8 q // time step. The action is executed at time 0 relative to
6 ]' O! [: `3 G0 J // the beginning of the loop.
% E, \' P& x I K7 I
' U! u8 L" Q5 e) L0 x // This is a simple schedule, with only one action that is, l! E- y' ?3 ^; h$ J! A
// just repeated every time. See jmousetrap for more) J3 r3 C3 ? Q2 w7 Z! r6 @" z
// complicated schedules.- U% x( @0 i/ r; h6 e3 S
6 }$ L' Z6 v9 O) L" A! Q2 H
modelSchedule = new ScheduleImpl (getZone (), 1);$ |& R( \+ x- a- y T) j3 T
modelSchedule.at$createAction (0, modelActions);
?/ t0 ~2 s2 P, [6 j0 r 4 ^8 j2 ~. _ r' A
return this;
: a/ P6 m4 j8 K: L( f } |