HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
( ~# v+ D2 x# H8 r
/ s3 [: O& u6 z& Z$ d2 s public Object buildActions () {
& m4 _1 c2 F% \% [$ i+ q9 x6 U super.buildActions();
7 h0 D6 I) e" f( f/ y+ V4 \+ Q" B6 K
9 y, e3 j: g9 O$ V3 [; Q" y. L // Create the list of simulation actions. We put these in
- A2 n9 y0 |# X4 ~- s6 S2 {' R // an action group, because we want these actions to be
% l4 m4 F; V1 v! E- u) w6 p4 E- e8 Q // executed in a specific order, but these steps should
0 {+ j/ a" X3 E, D1 W# `' `# c6 z) D // take no (simulated) time. The M(foo) means "The message3 Z' }# T$ C: y9 c& H& h& T
// called <foo>". You can send a message To a particular! \& F/ X7 O! s
// object, or ForEach object in a collection.1 X5 ?- d9 Z# }/ M1 D- b5 K/ {) n9 W
( j. r0 w- U5 k" q" F* x* Z1 b% v
// Note we update the heatspace in two phases: first run- w* N( M% p; M1 n
// diffusion, then run "updateWorld" to actually enact the7 ~4 ?& N5 h1 k1 J2 p% u$ z1 s$ g
// changes the heatbugs have made. The ordering here is
3 C7 w* ?8 n. Z // significant!
; d$ [" b0 S, V! `+ Y; h& x1 G& d* B
e) o& W1 U3 V0 ^* `2 g // Note also, that with the additional
0 W$ ?- X( K8 i, O2 U# T // `randomizeHeatbugUpdateOrder' Boolean flag we can
: d2 Y, L4 ]/ r // randomize the order in which the bugs actually run( P- p8 U% V4 I- n1 g5 M/ a
// their step rule. This has the effect of removing any& L/ |$ H; x# j3 Y* `% H! [
// systematic bias in the iteration throught the heatbug3 n. @' U1 r. s/ E3 ]
// list from timestep to timestep9 j+ `6 x2 S5 R/ n( i' }' i) E) g
0 b9 u0 n1 Q8 N n
// By default, all `createActionForEach' modelActions have
+ s& s! M! Y5 T5 A9 F // a default order of `Sequential', which means that the
3 z5 e( \: |! G // order of iteration through the `heatbugList' will be
) S8 A5 u/ F9 H# ` // identical (assuming the list order is not changed: E& Y8 l8 _, p' B2 P8 b
// indirectly by some other process).
0 y5 q1 b+ O% P3 M
- |0 m F2 I/ [' a; t" N modelActions = new ActionGroupImpl (getZone ());
+ p5 L, C3 T: ^. U' V4 L
9 o2 o) X# B- c0 T2 c try {
5 P3 h" p( |* e) N, L modelActions.createActionTo$message
( F2 L* h0 M2 T3 W; k (heat, new Selector (heat.getClass (), "stepRule", false));
9 t- P9 d* c; E8 ]5 _ } catch (Exception e) {
* w2 }/ N. e& a System.err.println ("Exception stepRule: " + e.getMessage ());+ u+ C0 e* V( ~- a% t" ~
}
6 _% c3 _- `( y. _* c
* ]5 C' u; f2 ^ p# } try {9 Y4 w" m+ A$ p2 f
Heatbug proto = (Heatbug) heatbugList.get (0);/ b2 k& C4 t: Q4 B; s* ?
Selector sel =
$ ~0 V n& ?" `) c$ d* z! M new Selector (proto.getClass (), "heatbugStep", false);* M$ P' `5 I* b0 o4 N7 Z
actionForEach =: h( y9 ]6 j# z Y# ?* J, X4 h
modelActions.createFActionForEachHomogeneous$call* ~9 H% k+ a. q, [; H
(heatbugList,( F! }8 S) w$ J5 v
new FCallImpl (this, proto, sel,
3 c/ \6 U- D- V/ o new FArgumentsImpl (this, sel)));
* C! ~8 t J7 S, `' i# o } catch (Exception e) {* q6 V/ u- Q! ?( M. \4 `0 T9 r6 d
e.printStackTrace (System.err);
+ y% M y$ m9 }# v5 X }
7 d+ \& N! u& k3 j0 p4 o" f1 U' w # o" S0 }6 r# F4 |4 c# z
syncUpdateOrder ();
: s O% A4 v, h$ C8 o7 i& `; w& ?7 p3 [
try {
h; k( M8 a, K modelActions.createActionTo$message
7 w6 O$ U C% H6 X; p- L C (heat, new Selector (heat.getClass (), "updateLattice", false));& n' [2 m& r' [ h0 K
} catch (Exception e) {# O/ p9 }1 I. u, |- Q
System.err.println("Exception updateLattice: " + e.getMessage ());" o4 K/ ?+ u* M& n1 m8 g( ]
}
; r( a- c6 @* N6 V8 V
8 W8 B# T) l* k, g* } // Then we create a schedule that executes the
7 U5 v+ h3 n) _: E! _( D // modelActions. modelActions is an ActionGroup, by itself it
$ |0 p7 X) S' b0 h# y4 l, \+ i' e // has no notion of time. In order to have it executed in) c% \2 _# h& \ m. A
// time, we create a Schedule that says to use the
3 V+ {$ X& Q. I7 m // modelActions ActionGroup at particular times. This
4 y# I6 ]3 |( ?% {) u" d" _ // schedule has a repeat interval of 1, it will loop every
% k) W- m, T+ D6 }2 ? // time step. The action is executed at time 0 relative to
, k; d. w) D5 N1 R& f5 T3 p# T- k! ? // the beginning of the loop.
( U6 k' E# \% \% P' K3 n$ r
( O9 f U5 p: z- M2 S6 [ // This is a simple schedule, with only one action that is
7 T% u6 N4 C* Q# D6 G% S; N // just repeated every time. See jmousetrap for more0 S- F3 f3 m) z2 g3 E
// complicated schedules.2 x7 D1 i/ a5 k( Z# a) }
( B: A: F; Y& |
modelSchedule = new ScheduleImpl (getZone (), 1);2 a: _+ K. w6 r3 `* O4 E
modelSchedule.at$createAction (0, modelActions);9 s3 A8 V8 e# I# b! ?* Q f/ j
+ B( E, z& f, X return this;- e5 _3 @! ~8 G3 @0 N, W
} |