HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
6 Q+ W. B8 b3 P
. O) w$ l! z6 ], t, x" N# Q. E public Object buildActions () {' n8 t6 l W* ?2 T$ f
super.buildActions();7 L9 Q2 k6 J, ?* d
3 y8 W' Q7 ^& {: u8 i/ U* ]& x. x
// Create the list of simulation actions. We put these in6 |" @3 O( n) \1 d
// an action group, because we want these actions to be
3 z4 k- S) P3 k. {* g // executed in a specific order, but these steps should0 M. _3 r1 C+ D4 W p2 p6 c
// take no (simulated) time. The M(foo) means "The message8 N+ [0 r5 e: ?+ x
// called <foo>". You can send a message To a particular
; R; [ Y. d2 G$ ?5 _: b6 t // object, or ForEach object in a collection.0 [' _# `# c( X4 a) l5 ], Z- c7 m6 E
/ @ _) G: x# w) \0 r
// Note we update the heatspace in two phases: first run
4 k0 M" j( i1 B! B! e/ T // diffusion, then run "updateWorld" to actually enact the
! H( [# |8 E/ a, `: w5 I; A8 s // changes the heatbugs have made. The ordering here is
* v A: p( d# @1 [8 y& X2 C" E // significant!
" n# N9 a9 v$ p4 @. L% B9 v * p1 C7 q2 a! I) }1 U @2 `) f
// Note also, that with the additional
! l, ?8 v. d# w# o/ ~' W7 o // `randomizeHeatbugUpdateOrder' Boolean flag we can. K4 F$ c5 z; L; R+ u- P
// randomize the order in which the bugs actually run) H! }2 K' x4 H! u8 z0 X
// their step rule. This has the effect of removing any' \( N: x0 D8 h$ g/ ]
// systematic bias in the iteration throught the heatbug; J/ s3 m" M1 y* Y3 t
// list from timestep to timestep
# {# r& A) i) Y# z! H. M& G ) S5 w h2 c$ B8 d0 g
// By default, all `createActionForEach' modelActions have* K& a+ K/ }: s2 {* V
// a default order of `Sequential', which means that the
+ p5 w- w8 C' J& C! I+ r4 ?! N // order of iteration through the `heatbugList' will be5 e$ J1 }. Z2 M5 O% ]
// identical (assuming the list order is not changed
, o4 z! B; H1 x1 E // indirectly by some other process).4 S9 j9 H9 X+ Z+ l% L: P* T& [8 v# g
7 s& e3 M4 p- [0 Z+ ~$ L6 ~ modelActions = new ActionGroupImpl (getZone ());
4 B% |2 ]1 I, q" C
7 ]& H% W. J. L3 C! s try {
0 A8 q) ]: x& d0 V modelActions.createActionTo$message' E! l q7 x' b) m
(heat, new Selector (heat.getClass (), "stepRule", false));% M, d% T8 g W" p7 b2 d. J- T
} catch (Exception e) {
9 I2 \" m; [6 a. \* m System.err.println ("Exception stepRule: " + e.getMessage ());( R/ ?) q: ~- h W+ x6 x4 Y
}; K% y4 O6 K! @
+ ?/ {3 s: \, Q7 X- ~
try {
W$ N( g- H5 D0 \# ^# w! B9 h4 ] Heatbug proto = (Heatbug) heatbugList.get (0);
1 x' h3 `! X9 L4 U" F& J M Selector sel =
`; G& @, g( N" a7 {5 t3 M( f new Selector (proto.getClass (), "heatbugStep", false);
, k( e1 _/ p4 ] actionForEach =
5 b! v* \: K5 Q1 h modelActions.createFActionForEachHomogeneous$call
7 R) X9 V& B$ ^9 D, l# o (heatbugList,
* e* G) ^: d) `, H new FCallImpl (this, proto, sel,
) [6 Q$ \5 C1 T. | a% A0 I new FArgumentsImpl (this, sel)));
! P& F" q- f) d. o$ x } catch (Exception e) {
6 ?0 x2 } c; J5 `. w e.printStackTrace (System.err);8 W3 n) k; l [) D+ s$ M) {
}
. G9 s7 C: z+ B3 V 5 w0 r% V# Y' ~1 r4 K6 _8 a
syncUpdateOrder ();
/ N; E5 h4 ]; x9 {+ t4 a2 x# s% L; o
7 B1 W& a8 D, }! v+ M% L1 s' f/ n try {7 _3 q0 D( S7 n5 w9 B. b& I; }/ n
modelActions.createActionTo$message
& w8 ^ P# h9 |( i (heat, new Selector (heat.getClass (), "updateLattice", false));% j% y3 ]4 L0 N+ c" p
} catch (Exception e) {6 m, z5 ^; m6 r8 ^. n
System.err.println("Exception updateLattice: " + e.getMessage ());1 G( w$ N- t( ]2 b7 Q
}
5 e9 W( \# J5 m # W; M4 q8 o3 W$ B9 X6 I9 a8 o
// Then we create a schedule that executes the
8 `& r! q& i, Z! r2 ^7 N$ f/ l0 t( u // modelActions. modelActions is an ActionGroup, by itself it) t# A! ~8 {% [3 C9 @5 j! {
// has no notion of time. In order to have it executed in
k8 k. H# t, N4 V // time, we create a Schedule that says to use the
& O; u8 k$ E, B9 G" a. s // modelActions ActionGroup at particular times. This3 d$ v, y! d; o# B9 S/ x% Z! B! d- w
// schedule has a repeat interval of 1, it will loop every5 U; l* o, R, G
// time step. The action is executed at time 0 relative to
1 E% e7 @& G3 @% _, m& V // the beginning of the loop.* x4 X3 q; h1 M( `: q
* N- y3 V( s& y5 K8 ~& \0 X // This is a simple schedule, with only one action that is
5 A/ o7 x: Q( m+ s& P8 O // just repeated every time. See jmousetrap for more' G% F/ _/ r( b! {
// complicated schedules.6 d; Q7 G3 v) l2 v+ a
3 i5 V2 s4 D& t' |2 } modelSchedule = new ScheduleImpl (getZone (), 1);
1 K+ J' F2 O8 Z% i, x" ~' f- ~ modelSchedule.at$createAction (0, modelActions); f) x3 t6 `: U* x$ a
# x" O9 ~1 ~$ g) |# R. ? return this;: ?- w, [: {+ p$ v
} |