HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:/ N- g" \4 E- }: I; i- j0 ]% P+ U: \
* N( `) g$ ]; ]' m
public Object buildActions () {3 g* s0 O) K. Z8 @5 \
super.buildActions();( C2 B; n8 @8 f! O8 i e
/ X) b. J$ j) k
// Create the list of simulation actions. We put these in2 b0 _/ P+ l: s
// an action group, because we want these actions to be
* A' W; C) h p/ ~6 x // executed in a specific order, but these steps should
$ C1 ^ Z5 y: t9 @' V6 w1 u g9 U // take no (simulated) time. The M(foo) means "The message
/ f% V. l+ |3 _2 A3 E: a* H" d // called <foo>". You can send a message To a particular* E# l! D0 o4 Y. F
// object, or ForEach object in a collection.$ D' ^4 h% [% y1 k
6 W) \& S: q9 f2 u
// Note we update the heatspace in two phases: first run
6 W7 c% l6 o" s7 {; f& X // diffusion, then run "updateWorld" to actually enact the( Q; n l# g7 ~. X- I: \* G
// changes the heatbugs have made. The ordering here is
: [1 ~/ r# e1 v- h J // significant!3 q6 m( _9 S6 Z' `/ k3 y% M. N
/ g! ]2 t$ P7 R* v+ I) u // Note also, that with the additional+ ^: q; Z- X( V1 O x1 R& I# K
// `randomizeHeatbugUpdateOrder' Boolean flag we can+ k# e4 H& G2 U. R9 @
// randomize the order in which the bugs actually run
: B$ d# e* K+ E6 @8 ^( k // their step rule. This has the effect of removing any: I) A/ a# k# R4 M# x5 V
// systematic bias in the iteration throught the heatbug' j A; b) ?/ O# i8 E
// list from timestep to timestep
5 M& m- `* l4 c" X$ |
4 A8 Q, _" x7 }" P& `1 }7 @ // By default, all `createActionForEach' modelActions have
( l- \8 u0 D/ |' p( d/ t$ ^ // a default order of `Sequential', which means that the$ @0 [$ v5 `& ?1 N+ Z( L
// order of iteration through the `heatbugList' will be/ c# N; D# f+ A8 l" F& ?4 A
// identical (assuming the list order is not changed
: x7 l3 z1 z3 Q Q // indirectly by some other process).
- L6 C7 L9 k: S
n m+ a! c+ S9 u- ?$ ] modelActions = new ActionGroupImpl (getZone ());
' [( i$ J% `0 ]5 t, U" Y: d; c; Z) z5 C
try {
. ^$ g2 y1 S5 B7 |0 \$ C7 s modelActions.createActionTo$message& V6 i# m' J: P' q, t: ?
(heat, new Selector (heat.getClass (), "stepRule", false));2 p0 k% S" a* R! v- |) d
} catch (Exception e) {
& d( `0 q$ T4 W0 D1 S System.err.println ("Exception stepRule: " + e.getMessage ());1 H9 C) i9 c& ^" T! b
}; Z6 q* b+ ]6 t/ A1 `3 f. }$ W
. Z# b0 m' z3 \ try {) v' u- X) \" z
Heatbug proto = (Heatbug) heatbugList.get (0);
' o- R! c, B3 t/ D Selector sel = ( o9 t( ]8 [ G' E# j! _( i& k
new Selector (proto.getClass (), "heatbugStep", false);
! \8 ?8 J0 h* H+ h4 P; d& | actionForEach =
( O- t( t% Z! A; x5 T% g7 u; ^ B modelActions.createFActionForEachHomogeneous$call1 f% Z. I8 T* \& q: Y, Y
(heatbugList,
* t+ n& t; L- ?4 O# S z+ G new FCallImpl (this, proto, sel,
]2 G' G# t7 w new FArgumentsImpl (this, sel)));
' a7 Y1 p$ l" f } catch (Exception e) {
8 a/ _* k+ V' Y6 X) S e.printStackTrace (System.err);5 H9 V5 p; c7 h) d) ~# U2 s
}
7 Z- B6 Z" z! a+ }" [ ' g3 \2 f5 {1 H8 N+ }
syncUpdateOrder ();
$ s& K% t+ X& u0 q$ e6 D7 |1 a* X* g: M4 |' E" }: Z
try {
5 N$ j5 A( |5 R+ H9 c" h modelActions.createActionTo$message
& j6 O* A% l# G g (heat, new Selector (heat.getClass (), "updateLattice", false));
, o7 b. _6 y8 z. T6 O+ | } catch (Exception e) {
$ _" U, s: h3 P System.err.println("Exception updateLattice: " + e.getMessage ());; m6 o z, N+ T ?
}
8 G2 _# P$ P( t" c: R- c) x
8 ?& V, n2 F+ c2 Y( } // Then we create a schedule that executes the
* O3 w( d" M2 S$ E6 {7 E // modelActions. modelActions is an ActionGroup, by itself it# j: R' K: Q: S5 I7 h8 w9 [2 W4 D3 d
// has no notion of time. In order to have it executed in
% d3 |8 z2 K& P% n( | U5 p. D% t // time, we create a Schedule that says to use the$ P/ a/ g" `7 y0 F
// modelActions ActionGroup at particular times. This
! K Y4 | y$ M7 L& v) [ // schedule has a repeat interval of 1, it will loop every9 v$ G% ~4 J6 f9 D0 Q- x
// time step. The action is executed at time 0 relative to
3 s7 h1 x3 w! d3 _+ A" a // the beginning of the loop.- n" Q* q9 q- U) E/ z: F2 `
& z" r0 F/ \) J0 \6 q
// This is a simple schedule, with only one action that is
0 R: W+ L9 M9 o2 t // just repeated every time. See jmousetrap for more
q5 X1 P# a5 _: |- g; u( u // complicated schedules.
B2 W" z& j* h- p9 A! r( c( K
: k. q$ @$ z( K7 N modelSchedule = new ScheduleImpl (getZone (), 1);* r7 [, g" Z1 q; E
modelSchedule.at$createAction (0, modelActions);6 m& a- F6 z% g5 V+ g3 o' t1 i" Q( E' T
Z3 t1 J5 D: m6 o1 T" K
return this;! k* W& s3 B/ o& F/ E
} |