HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:# S/ `& E8 V: \( @& _ z
4 M8 m4 B0 A O3 C* D4 |) F
public Object buildActions () {$ f! d, L" I3 c) @
super.buildActions();$ I w u5 x' k4 }( a, m. ?
& m' ` f+ c1 x& j6 l% _ // Create the list of simulation actions. We put these in
' I1 P$ x) u$ h% y( P9 T$ b // an action group, because we want these actions to be
3 @( z/ R, a) \! f8 z" p0 l8 e // executed in a specific order, but these steps should4 X, \' v# U+ v. C
// take no (simulated) time. The M(foo) means "The message( W/ x9 T- K! P N! b+ Y" c( \
// called <foo>". You can send a message To a particular6 c# m$ w7 }6 g( P1 w5 @
// object, or ForEach object in a collection.
& |2 `+ H/ e+ p
2 \( K; G( K$ M& C // Note we update the heatspace in two phases: first run# M# P7 F- {/ ?6 `
// diffusion, then run "updateWorld" to actually enact the
* ^! B9 B0 k% p$ O5 _8 M1 ] X, C& {, _ // changes the heatbugs have made. The ordering here is
9 J/ Y' e4 `% V6 @ // significant! u# Q9 G5 X a: U- x' B
0 e; Z) G1 O; V/ f // Note also, that with the additional+ x5 W1 \! S' h9 v
// `randomizeHeatbugUpdateOrder' Boolean flag we can
+ D4 N& O, y7 K1 Z* `) C6 ^' A9 @ // randomize the order in which the bugs actually run
- v6 e# u2 G5 g; P# R/ i6 d // their step rule. This has the effect of removing any
- P) y6 G4 T+ O3 \! @$ }5 m9 u // systematic bias in the iteration throught the heatbug- ?: t; `& G, i) F! f5 [
// list from timestep to timestep
$ D. a- t0 I3 D- k. H5 G j0 n
7 \( A* v" S1 k8 k" H& ` // By default, all `createActionForEach' modelActions have
6 [6 [$ l( U) Y* W. n- v$ f // a default order of `Sequential', which means that the
2 {! i" T) D1 m7 F' }% `% F" H // order of iteration through the `heatbugList' will be
+ n/ J* S3 Y. U' C. J // identical (assuming the list order is not changed
) j# {8 ?4 E( F3 i2 ^' ? // indirectly by some other process).
8 U, B* f1 t5 g 1 j7 k7 X0 E a; a8 X, W! c
modelActions = new ActionGroupImpl (getZone ());) I+ M- `4 p: O8 q- G7 c
) O; d$ i7 _1 [( U# t7 B% @+ q
try {6 x6 q ~, E/ `) j6 I% d9 m3 j+ b
modelActions.createActionTo$message1 o( y' Y3 L; e( w* i
(heat, new Selector (heat.getClass (), "stepRule", false));5 Q8 S3 O$ m1 x3 n8 a$ p1 Y
} catch (Exception e) {
1 u9 a- {& v0 Q- }) H6 v3 f; x# p System.err.println ("Exception stepRule: " + e.getMessage ());
4 ~7 C; {+ {9 Q+ l5 V }& ^+ Q, p, v: @4 F5 v4 G0 Y
) u7 J+ q: ]& l U
try {- {. P2 g6 Q8 B4 ^3 m7 U
Heatbug proto = (Heatbug) heatbugList.get (0);5 H2 k, \: |/ M' i. v1 H/ |
Selector sel = E( E' y, \) J0 Y' j/ e4 S. }, U: Z8 B
new Selector (proto.getClass (), "heatbugStep", false);
2 ?$ ~5 g" Z! O3 S3 V: |% S6 Z actionForEach =- x" x# D2 J+ V; m* w
modelActions.createFActionForEachHomogeneous$call
" l8 V- G0 a5 x* K0 m8 k (heatbugList,/ V# l5 k4 W/ j) B
new FCallImpl (this, proto, sel,
( l5 P) Y8 {0 Z9 A new FArgumentsImpl (this, sel)));- m2 p1 s3 v- n! W/ p
} catch (Exception e) {" [' E- q- q1 O& ~8 F2 U
e.printStackTrace (System.err);
0 P2 u' ]* T; r- B! Y; [ }0 g2 I u5 |* f7 w3 D
- u' W% {. S/ v H! _7 h% L( r; c syncUpdateOrder ();, G% g' ~3 S) x0 X
: ^2 I. @: D2 m try {& k. j* u, m7 K' a) Z; Z! W( ~
modelActions.createActionTo$message
@0 D1 f, t- Y5 [1 {- t (heat, new Selector (heat.getClass (), "updateLattice", false));
" A$ e/ ~5 i4 `; v. S. Z5 b3 m9 @ } catch (Exception e) {
0 ? O9 q6 o6 E0 h System.err.println("Exception updateLattice: " + e.getMessage ());, z7 u6 f* f8 Q" @0 j
}
+ Q9 ] ~6 L8 ~# a0 `, _3 d! W! @, j
- ^1 I0 f1 {1 X& U& d# T* d // Then we create a schedule that executes the
' p3 {) t" w& t& v5 Z9 {, L( C* Y% R // modelActions. modelActions is an ActionGroup, by itself it
$ G8 H1 R# q3 p/ q# @, j7 ?; Z // has no notion of time. In order to have it executed in
" n x5 R9 n0 C% ?7 Z // time, we create a Schedule that says to use the. f7 t/ z+ E- H3 H6 g& {3 W# k
// modelActions ActionGroup at particular times. This; c* a, L7 I( z) }! |* \
// schedule has a repeat interval of 1, it will loop every. T* @# Z: C! X: \& I7 R9 p
// time step. The action is executed at time 0 relative to
6 z- c0 W1 I! f: O3 u! R // the beginning of the loop.
1 I. ~& E _) G5 a8 g$ p0 P
* f+ _3 Y% `% N# S Q8 n" U- @ // This is a simple schedule, with only one action that is
- s- U1 u" s4 H' }( d D1 ] // just repeated every time. See jmousetrap for more: |& `$ Q1 R8 k; G
// complicated schedules. |5 a# B& a; \1 v
) a: s8 e# a, [3 C9 w9 Q
modelSchedule = new ScheduleImpl (getZone (), 1);
4 K% ?0 @3 N7 f v5 X! t- I1 L6 a modelSchedule.at$createAction (0, modelActions);
7 I; z) `! R( {
* Y7 f: }) ^# t5 } return this;
3 w; y9 w b. H; D! i3 q+ W } |