HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
" C1 h, `6 \" c& _# D5 N5 G5 K' @ s; W8 f4 G5 G5 g# f
public Object buildActions () {
+ u8 l+ Q; X1 x2 M% ^2 i5 N( _ super.buildActions();
! p8 S6 C3 B3 A9 ~: w( o, z) V
; K8 }( \, D* W% h( ]1 z // Create the list of simulation actions. We put these in
/ {: }* H5 T; H: i$ x- I // an action group, because we want these actions to be( H# L+ M t# j9 e+ l; H& B: N' q
// executed in a specific order, but these steps should
8 L& ?% d) q5 I0 n' ?) o // take no (simulated) time. The M(foo) means "The message2 U* c: x; N! |* Y# Z
// called <foo>". You can send a message To a particular4 o" |. _' k, a
// object, or ForEach object in a collection.% E; m$ U9 ^# a# I/ d" }& D
5 }* f8 v& p A( X5 z$ U. J- ]- u" z( e
// Note we update the heatspace in two phases: first run
' U- Z9 w& \4 N7 w* c$ A // diffusion, then run "updateWorld" to actually enact the$ p* H' |" L5 n( l4 Q8 Q6 D) D, P8 Z
// changes the heatbugs have made. The ordering here is; P% A& C+ M* y$ F8 [7 X
// significant!
7 P* Y* L' y7 |3 V0 n 7 |. F: q! i7 _2 u5 I* u: O$ N
// Note also, that with the additional
: p4 J$ c- E) N/ F // `randomizeHeatbugUpdateOrder' Boolean flag we can
m1 j. P* M4 d // randomize the order in which the bugs actually run
0 d$ t* \' a. j6 v9 w // their step rule. This has the effect of removing any9 z+ n' M# }$ v9 H( [1 N2 X' x
// systematic bias in the iteration throught the heatbug- U! p6 } J5 Z! G4 o3 a
// list from timestep to timestep) }6 d& o. g$ S* j
/ G+ [; ~6 {0 D3 g7 }9 a2 O // By default, all `createActionForEach' modelActions have! ~* B3 {; E- c- _8 D
// a default order of `Sequential', which means that the
' H0 z4 W2 B1 Q6 ^ g // order of iteration through the `heatbugList' will be
9 R7 Z: ~, z h i1 c+ A* H3 q% X // identical (assuming the list order is not changed2 h6 \- _ ?, J- a5 V# ]4 O$ T
// indirectly by some other process).
$ @- D' T' B, U( v1 J O
5 ?( c; y3 f# ~- Z modelActions = new ActionGroupImpl (getZone ());# u/ o+ c1 Y1 M% W
9 `* v. Y# u1 s* S
try {
# Y0 p4 R% \/ a; _/ e( Q" H7 e modelActions.createActionTo$message7 y O$ ?* k# E
(heat, new Selector (heat.getClass (), "stepRule", false));
0 s4 ^* m$ I/ X' l4 V& C5 Z } catch (Exception e) {
- A7 P/ w+ V, Y2 w System.err.println ("Exception stepRule: " + e.getMessage ());# `+ G }4 Q0 c5 b; ?
}
# ~: K, G, r+ l* G" `% r' _$ a' _$ R# z1 B* g; T
try {
' p. e% H5 J; q Heatbug proto = (Heatbug) heatbugList.get (0);
) @2 d! p! J. y+ d! @! t1 @+ @4 Q' | Selector sel =
. v& ~. F, R) n; C u( o new Selector (proto.getClass (), "heatbugStep", false);
$ {9 D- ?6 q7 ^' o actionForEach =
3 l& B8 _1 \5 O9 ?$ ?- F9 `3 S( S modelActions.createFActionForEachHomogeneous$call i- W; v( `9 t
(heatbugList,
+ k. E* B7 l {( b; b$ V9 y- T new FCallImpl (this, proto, sel,
, H6 |6 f/ ]8 m2 u, K new FArgumentsImpl (this, sel)));
- o( ~9 [) N- R, V, Q7 A } catch (Exception e) {( V/ K) g q% D# K& E, i1 j+ J- u
e.printStackTrace (System.err);
2 z0 B5 p. u }6 q, m }
% E. q8 k4 Y& k! ^ 8 |! q: W) H& y" T& P
syncUpdateOrder ();4 X: ?: c& ?/ ^: h4 W2 X& A
: x, h7 K4 ?/ x" Q6 R4 x( s try {* Y8 L/ ?$ o9 `( a3 ?* n
modelActions.createActionTo$message " d* T- X" z+ U5 m7 O
(heat, new Selector (heat.getClass (), "updateLattice", false));
. h9 N T5 o) [: G& a+ Q+ Z } catch (Exception e) {
0 s- }: L( ~* O# X3 o System.err.println("Exception updateLattice: " + e.getMessage ());
0 [2 ~6 X9 u0 c% m" Y7 J! g# U. U" F }
/ h4 G" R q: X) O, X& K+ L
8 m ^ l; i; i+ M // Then we create a schedule that executes the" r7 G* h( Y/ [7 Z. ^( d
// modelActions. modelActions is an ActionGroup, by itself it. R) w) O. ]9 ^; R
// has no notion of time. In order to have it executed in
/ } F3 C: O6 _* `% H o+ {% \ // time, we create a Schedule that says to use the
! \7 U9 h6 b# F) Z0 @ // modelActions ActionGroup at particular times. This
" v4 V3 a5 Q: B1 _ // schedule has a repeat interval of 1, it will loop every
0 ]* a8 v8 W2 ?$ K // time step. The action is executed at time 0 relative to
' T. s! P. n" q7 C; t( R1 _( J8 N // the beginning of the loop.$ {/ p7 _. _6 {+ P7 n9 [
1 ^/ a) b' c' q' `) c2 j
// This is a simple schedule, with only one action that is
2 ]$ }& X/ {4 s1 j& k // just repeated every time. See jmousetrap for more
' Y2 [% h9 e0 A @( \7 {7 O // complicated schedules.) G6 o" Y3 p$ b" U
% x i# c) u3 ~2 U+ a5 }" [) P modelSchedule = new ScheduleImpl (getZone (), 1);
. s. [; _& s5 U6 n0 R modelSchedule.at$createAction (0, modelActions);
+ Q, p) ]+ f( j9 Y' t0 y2 z8 [ # R, ]5 D' K0 s7 o2 |( U4 D8 }% ^
return this;
- f# P' R' p3 z# j1 t } |