HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
5 d( v( ]% S8 w$ T, [! l6 \0 v9 H& }, U
public Object buildActions () {- }, ?/ C4 H8 v* P' h
super.buildActions();
8 \9 @, H& u5 E- r9 I' F
% U# a$ [8 T- j/ q // Create the list of simulation actions. We put these in
% t4 M# f) R/ r' q2 d0 H // an action group, because we want these actions to be$ K7 v3 m5 l1 q1 L' q( X
// executed in a specific order, but these steps should
7 w" d" C8 K# \$ S( T1 T* k7 { // take no (simulated) time. The M(foo) means "The message( l( F/ o& v, p- N$ Q$ J$ o3 H
// called <foo>". You can send a message To a particular
0 ~. ]1 ]& y. z" N! u$ Y7 ~ // object, or ForEach object in a collection.
# H" j4 U# W' Y& X1 L5 o. O% P
# `' ]' H& B6 W {3 \+ B! [. M // Note we update the heatspace in two phases: first run& i7 Q8 g/ I/ T, f7 y5 x
// diffusion, then run "updateWorld" to actually enact the
, q% ^& Y0 i# q // changes the heatbugs have made. The ordering here is
- a$ \+ J3 {# I8 m/ ?5 ~/ |3 z! X5 ` // significant!
3 U* ?: g0 ~) x; C' o( Z! y: ]
0 [- a/ h9 e* q // Note also, that with the additional
2 U4 x6 x. N: B. _* [" }9 j' g4 j // `randomizeHeatbugUpdateOrder' Boolean flag we can
% D4 Z0 l* C# n3 J // randomize the order in which the bugs actually run
! ^% m% c; G' z' z, ?0 ^2 W5 u // their step rule. This has the effect of removing any) f2 B' B2 X ]) ~
// systematic bias in the iteration throught the heatbug+ h$ E+ L; j. ]/ w
// list from timestep to timestep% {) s, ]4 F% _
! F; {( o8 `1 P6 `$ w0 Q) x" ~ // By default, all `createActionForEach' modelActions have: P4 _- D; B! ~) I# G8 R# s* {' K
// a default order of `Sequential', which means that the
- O' w9 l; \. {4 G) ? // order of iteration through the `heatbugList' will be2 h& S# W1 W" h
// identical (assuming the list order is not changed. Q" V, }& n4 c. `" |
// indirectly by some other process).
$ k# N+ f" c3 X' P! d ! y' }4 I* D3 `$ l% T; g) X! q
modelActions = new ActionGroupImpl (getZone ());; j, }7 {' x6 x7 B& a5 [3 i
+ Q! B- i7 j7 a/ v, k; C try {
, X5 c2 r/ p* v8 v' L8 i# g modelActions.createActionTo$message
% W w- H* W5 | U. `4 ~8 C (heat, new Selector (heat.getClass (), "stepRule", false));
' `1 `5 ]8 `! u } catch (Exception e) {' U& V% B q" z9 h/ i( j% C
System.err.println ("Exception stepRule: " + e.getMessage ());3 s- i. u* _$ k& G
}9 a( J7 n: @1 x; X, r0 W
% l K/ I; Q, W; W2 d try {$ j7 f1 D( @, W: b: n7 O
Heatbug proto = (Heatbug) heatbugList.get (0);, R" k! l$ m" @( ]
Selector sel = 0 Q7 S% d8 ?1 Y) p# p$ A+ t# V
new Selector (proto.getClass (), "heatbugStep", false);( l) L7 Y2 z; f5 A# [* d- |
actionForEach =$ y9 O X9 d) b
modelActions.createFActionForEachHomogeneous$call6 k. }: o+ T P1 L
(heatbugList, o7 Q# w: |/ q7 H
new FCallImpl (this, proto, sel,! U1 J5 B. P8 O6 l6 U+ ]
new FArgumentsImpl (this, sel)));4 ~9 s0 T; A) x
} catch (Exception e) {, c* z3 H+ \2 A' d k% f
e.printStackTrace (System.err);& H1 ?* F; I1 c4 p6 u( J% e
}
- G1 C9 g) z% J- r3 ^ 0 @; X- @0 w' [4 |" k6 A9 G. J W
syncUpdateOrder ();
! Y3 l- T! w9 I; R7 k w8 ^: S& y
try {3 i5 e v9 Z2 k1 ^ A
modelActions.createActionTo$message 8 ~* f: Z% [2 z1 s2 s
(heat, new Selector (heat.getClass (), "updateLattice", false));/ A8 e/ I1 @8 g2 a q7 w+ g- t6 |
} catch (Exception e) {) t/ h0 m7 Y2 @$ a7 m4 l' U
System.err.println("Exception updateLattice: " + e.getMessage ());. G! B _# L% D% B' [
}
9 ^$ A% Z( n+ w* z- k! S, e& D
& A3 _! U8 q% }" R' f* p" t( { // Then we create a schedule that executes the
7 B8 L* s: L, y t, l3 _ // modelActions. modelActions is an ActionGroup, by itself it
0 b6 Q5 a9 k1 i% a# X( c& F8 Y$ \3 p // has no notion of time. In order to have it executed in" [/ L$ w; D" |# r, _
// time, we create a Schedule that says to use the* w; a4 c# O) R% ~* D
// modelActions ActionGroup at particular times. This4 w6 R6 T5 A% g, f
// schedule has a repeat interval of 1, it will loop every
$ a7 E$ _. m. i# ~. s& w // time step. The action is executed at time 0 relative to: _$ ?4 F3 K5 ?, S8 E. \
// the beginning of the loop.
u9 k1 _1 {, @$ V7 r1 f; \6 w& b
// This is a simple schedule, with only one action that is
0 M0 E$ ^; U Z* H9 y // just repeated every time. See jmousetrap for more
q* M) q4 V5 D2 j // complicated schedules.2 y+ }) f$ Z N6 u* P
% L" e5 L/ }; a. U# G. M modelSchedule = new ScheduleImpl (getZone (), 1);
0 \! N9 Y$ `- _, j5 E7 ?$ F modelSchedule.at$createAction (0, modelActions);
) y7 d- _0 q$ |" q' Z9 [
, \; o2 m+ V+ u4 g# D d& H7 y return this;
2 A: T! a- s6 `6 N% Y } |