HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
" u! p: Y; W; y1 {: E) }0 J7 {% M+ K$ |
public Object buildActions () {
) `- g" @6 F3 u, W super.buildActions();( A/ d: `; H; W. A( y
8 |" l3 l9 e/ R9 [* K
// Create the list of simulation actions. We put these in9 x! l! R- m4 B# ]0 ^
// an action group, because we want these actions to be
; U5 |* _1 R: j" ] // executed in a specific order, but these steps should
( W# m3 }/ J+ {7 d" a7 y' E- v // take no (simulated) time. The M(foo) means "The message
K7 B3 F8 g6 `# Y8 k // called <foo>". You can send a message To a particular
6 `/ I: V, K! E, c1 x // object, or ForEach object in a collection./ G8 s& _2 S# p1 i) B
+ N0 ^+ ^7 d* [/ R0 X0 \4 | // Note we update the heatspace in two phases: first run
, R7 F0 e9 k' Y: {0 }/ o // diffusion, then run "updateWorld" to actually enact the% q3 M) v3 q9 n! M! {2 G$ h" Z, c& T
// changes the heatbugs have made. The ordering here is5 o& b5 U* g4 W
// significant!7 r2 _- [8 }6 R2 _' H: T/ R' A' u
2 T5 @7 c$ V& B7 C O7 q // Note also, that with the additional
0 }- G4 O" W4 {( _+ g/ \# J // `randomizeHeatbugUpdateOrder' Boolean flag we can3 ~$ L0 V% y& k$ x7 z
// randomize the order in which the bugs actually run
6 n+ A( ?4 m) W/ V* b b // their step rule. This has the effect of removing any
9 S% v" e! c4 t: |0 B9 B1 O // systematic bias in the iteration throught the heatbug
" v$ }' D, J% w4 Y // list from timestep to timestep
" w' u8 C9 D% y! I$ A- a
/ ]- b7 P" Y2 y" b4 ^/ t: ^* f9 I6 A // By default, all `createActionForEach' modelActions have& t0 E2 y" Y2 _. |( N/ m
// a default order of `Sequential', which means that the
: K, V% ]/ g" |) u: e7 ~ // order of iteration through the `heatbugList' will be
$ g' V4 `, D, ]8 h7 [4 U/ \ // identical (assuming the list order is not changed
. A; `& t. V) Y/ |" ^+ [3 X // indirectly by some other process).6 i' s J% T; t6 ` o5 F( T! @
8 E" v, g% K( u% G4 a% z. y modelActions = new ActionGroupImpl (getZone ());
. f' a* {( H9 O
% W4 b3 t; s) R# l$ P8 x0 a$ c try {5 e2 a" E; j2 m9 T% ?3 t. b3 A
modelActions.createActionTo$message5 J6 \$ X+ k0 R0 C8 S1 W# I
(heat, new Selector (heat.getClass (), "stepRule", false));* K1 P$ ^; v8 y; }" ?2 N2 s6 p
} catch (Exception e) {2 ~* Y/ d- F0 g& R9 T' |
System.err.println ("Exception stepRule: " + e.getMessage ());
% K/ r9 |& e0 |! B+ x/ f6 B }' M( p+ T; g8 e! `5 E$ N% t$ Q0 u
0 H7 D* M0 K& {* `0 O
try {
1 v! m8 u- M% e0 [/ w& m Heatbug proto = (Heatbug) heatbugList.get (0);
) j! p- M) R+ P i1 ` Selector sel = 6 b. l' j! L* }+ R! }
new Selector (proto.getClass (), "heatbugStep", false);- |- Z. b- @& A- Q. M2 X3 G
actionForEach =( ~( _- S" v8 x4 K' W: {
modelActions.createFActionForEachHomogeneous$call
% k3 f z3 f% T2 n- M9 H (heatbugList,1 A2 `# B9 g. r/ p
new FCallImpl (this, proto, sel,
( m9 b! t2 M# e% Q new FArgumentsImpl (this, sel)));
5 R# `# w- d9 ?. ?2 e2 p9 z- C } catch (Exception e) {7 l5 b. l- |# q b
e.printStackTrace (System.err);
+ P+ y9 q% M! p9 x7 x }; c; a6 G6 g3 m+ U# j
- D3 r5 l* k" n3 p! }" p9 o
syncUpdateOrder ();! Y6 h4 H, A; A+ o3 H
C4 i* x+ W- t* ] try {
3 R9 Q! O- N" A: Y( D1 o& A modelActions.createActionTo$message
. Y! T# O9 _8 J+ k (heat, new Selector (heat.getClass (), "updateLattice", false));
8 {% ^# g) g* V6 j l } catch (Exception e) {8 I9 V; r- G+ ~. B! K1 m
System.err.println("Exception updateLattice: " + e.getMessage ());( Y4 ^+ J0 ^! t( W$ A. V
}1 o* Y3 v7 p% Q# ^
- Y* F% o: Z: f# H2 U% m$ A$ G // Then we create a schedule that executes the
# \( i. L/ z9 x5 b9 h" j+ O // modelActions. modelActions is an ActionGroup, by itself it
* a( @1 i4 a | // has no notion of time. In order to have it executed in
! K; b. Z7 I. T+ O T& H; }9 n // time, we create a Schedule that says to use the
. ?1 m6 z% n: s- ?/ D) C) C // modelActions ActionGroup at particular times. This( C4 F, h+ |& z; I
// schedule has a repeat interval of 1, it will loop every, I" ~3 a/ I. w$ ^
// time step. The action is executed at time 0 relative to
. \5 h9 o* d6 S$ N2 d // the beginning of the loop." _1 m( @' d+ M
7 g- m5 o" Y; O* U# B& Y* p2 w1 e // This is a simple schedule, with only one action that is
6 n: t, a U: V* p* V // just repeated every time. See jmousetrap for more
1 s2 R# j* Y% b/ u* | // complicated schedules.5 a4 L: r. ]4 `
M x) J+ I- J$ p' c: \ modelSchedule = new ScheduleImpl (getZone (), 1);
8 h/ K- \ m3 U- q) C3 [ ]6 J9 _6 A modelSchedule.at$createAction (0, modelActions);
) x; {; q8 P1 D ( i0 H) D3 d4 a' S" I4 C
return this;
8 R+ S9 m% C5 X1 j; z } |