HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
8 i5 C) y# }0 u$ ~; h: M9 C+ n5 m/ M, I0 S8 c2 O; g
public Object buildActions () {
% b( g/ Q# J% E2 X: C super.buildActions();
5 _. x( |" p) J- @ - U! f F1 _4 N& i, O
// Create the list of simulation actions. We put these in5 @$ z* [' [( b% o9 g$ Z, N
// an action group, because we want these actions to be
6 V% ?) F1 | G: _6 {/ e( \ // executed in a specific order, but these steps should- y! c5 o+ x" _9 y i0 ~& e3 \' M# ^0 o
// take no (simulated) time. The M(foo) means "The message$ U; V& i& `/ v
// called <foo>". You can send a message To a particular0 m& G, |7 G5 y; Z, V# C8 V
// object, or ForEach object in a collection./ x0 A$ O1 m( q/ y
, ]2 K. x# ]% o* G2 K) D ^) e // Note we update the heatspace in two phases: first run
8 e3 q- s- m5 u8 e- t! }! W // diffusion, then run "updateWorld" to actually enact the
, G" j' C2 H4 Q/ s. V' R // changes the heatbugs have made. The ordering here is
: ?. t) S6 F1 E/ p: X // significant! x# [1 u) F9 x3 r3 O% M' X
& I$ T# O# r7 F' W1 [' U // Note also, that with the additional
/ Q- O& O8 N% Z9 y! v' a // `randomizeHeatbugUpdateOrder' Boolean flag we can# ~2 @% a1 `5 Q {2 Z) {
// randomize the order in which the bugs actually run! B6 U* L! Y$ X- o! O
// their step rule. This has the effect of removing any2 B/ N8 m, X' ]
// systematic bias in the iteration throught the heatbug2 ?) `) v0 N4 `% K l/ X1 f5 a
// list from timestep to timestep
4 I _, _* s& h/ i
' q8 u7 G5 G# O O* i" N# H0 U // By default, all `createActionForEach' modelActions have0 H0 V! n/ P1 l9 _; T' o# } @
// a default order of `Sequential', which means that the; H! ]! F4 O; [ k2 J! D; f
// order of iteration through the `heatbugList' will be& S; |! L) p2 i+ W2 D
// identical (assuming the list order is not changed( \/ B0 Q& U' }) ?& E0 \
// indirectly by some other process).
* Q1 w$ j$ J4 C/ }' B9 G* V 5 ?- G# o5 Z& A& i6 r
modelActions = new ActionGroupImpl (getZone ()); l# H" V2 b ~
2 z# x, p3 l: J# M0 [ try {/ {; E" ~+ ~4 I. e: t
modelActions.createActionTo$message$ m; X t$ c, l; v& }
(heat, new Selector (heat.getClass (), "stepRule", false));' b, G0 H' X2 P1 f% c: Y
} catch (Exception e) {
& \5 {8 {# P+ }; f9 Y System.err.println ("Exception stepRule: " + e.getMessage ());: \- @2 c4 q, o+ `- B$ ^* |
}: s% C! X# s n
* d. T3 F J0 x9 |
try {
+ n. i1 }" Z* o+ z7 O5 z: j Heatbug proto = (Heatbug) heatbugList.get (0);
- v# Y: r( m1 ]" } Selector sel =
/ G' }( X/ ?- t new Selector (proto.getClass (), "heatbugStep", false);
' n0 b* U& B; l: `4 J actionForEach =% ?$ z, l* [; d$ @2 F4 e0 f- q
modelActions.createFActionForEachHomogeneous$call
6 R4 M" U) ~' L" [ (heatbugList,
1 H+ b; ^# [9 s9 K5 u4 y new FCallImpl (this, proto, sel,
: p: R% k9 k0 C- L+ I+ h new FArgumentsImpl (this, sel)));
( w( [* g3 d7 I# g W4 L9 q% W } catch (Exception e) {
) J6 d+ j+ v3 O e.printStackTrace (System.err);
9 B$ x- @3 \; q# U+ J/ \1 `9 ^ }
6 v: A4 S: a g 1 ?/ m4 w }( Y4 L1 @0 f1 J- `
syncUpdateOrder ();
4 h* m4 N' K0 ]/ g4 a
3 d7 l# \1 M" e# s6 t/ ~. b" N( D. C try {
, I. a3 j* f7 L+ ^ modelActions.createActionTo$message ! \4 [2 M9 h5 u
(heat, new Selector (heat.getClass (), "updateLattice", false));4 t/ |! G2 Q' `+ K/ f9 A
} catch (Exception e) {. `% f( F8 K! j& @6 @- k+ ]
System.err.println("Exception updateLattice: " + e.getMessage ());
& s% Q: E( H; A8 S* T+ v }4 v) D7 H/ z& d4 j
" N) X& b7 x$ ^ // Then we create a schedule that executes the5 N7 T/ R. D* B/ B; U% `
// modelActions. modelActions is an ActionGroup, by itself it$ ]& w" v2 _/ s1 L- x. k, a- t
// has no notion of time. In order to have it executed in6 y8 l" h5 C9 d* S( |0 [/ L+ l
// time, we create a Schedule that says to use the
3 c9 H# u% [9 z2 G# L$ q1 i9 O3 N // modelActions ActionGroup at particular times. This/ C* r8 k- V( L5 E
// schedule has a repeat interval of 1, it will loop every
0 L8 E' u1 e' n; F# }3 {, y* v // time step. The action is executed at time 0 relative to6 C) j- T& B: d) P2 b1 o5 W
// the beginning of the loop.
. u e! M: ~! \, N0 \! d0 J/ K6 B2 J
' c6 q7 [/ L/ O% B // This is a simple schedule, with only one action that is
" k6 R# d+ G" d& {& O- n- U" R2 { // just repeated every time. See jmousetrap for more
' \( l# T0 J+ D // complicated schedules.
2 X7 d# G- N3 ^4 B $ `, @1 I8 u8 J' q9 |8 v* I
modelSchedule = new ScheduleImpl (getZone (), 1);1 C. M7 ]! w0 [
modelSchedule.at$createAction (0, modelActions);! G1 E$ c: I, ^ e4 V; V' ?1 z
2 U6 D& |& ?) _6 O return this;5 m8 @2 v, A/ |# n& n) _! s/ H' P( F
} |