HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
3 E2 G- c) Z4 b* m, l2 \: S- ]7 L4 O. W& \$ ~
public Object buildActions () {
8 i$ l- }+ l0 O super.buildActions();( X" ]* e4 c% B: B9 `+ H
6 B! c* ?2 z3 j% z/ J" E0 ]
// Create the list of simulation actions. We put these in
4 _1 c6 L3 J, H: k2 o6 k // an action group, because we want these actions to be
5 o" a6 N8 X5 y& h0 y2 s9 ]& J // executed in a specific order, but these steps should0 ?0 b1 f- x/ @; ]
// take no (simulated) time. The M(foo) means "The message
' _1 N+ X& k/ g" a/ f* r // called <foo>". You can send a message To a particular2 m u; l5 Z* W9 m
// object, or ForEach object in a collection.
# S/ y! |- C0 f- {8 a
4 F5 \; [7 Q9 W3 F // Note we update the heatspace in two phases: first run
5 w! P7 k9 _) ~1 |5 \4 B7 y7 T. D // diffusion, then run "updateWorld" to actually enact the e f$ x$ b3 C' f5 }5 |7 u
// changes the heatbugs have made. The ordering here is
: k3 ]* v3 y6 C2 }" Z // significant!# N4 e* R, U4 a1 y# P
. U1 o6 w: \ [( Y/ E( u( J
// Note also, that with the additional* Q( t: f, T; \/ U E4 {( |
// `randomizeHeatbugUpdateOrder' Boolean flag we can
- Q' U. `/ [, y m' b7 l+ d+ K // randomize the order in which the bugs actually run1 g' ]* Z7 ?# m
// their step rule. This has the effect of removing any# r; r* n7 g3 w* i5 g3 }
// systematic bias in the iteration throught the heatbug
0 m, d7 } w9 S9 c, V; c // list from timestep to timestep
. o6 r6 W Q3 u; _" F6 s/ {) D. g $ `9 a% R7 l/ o' v3 f
// By default, all `createActionForEach' modelActions have
8 X: C F3 _0 P0 u p, y // a default order of `Sequential', which means that the( G2 P% y- x; o3 L4 t
// order of iteration through the `heatbugList' will be
- |% I$ f) t: A' ? // identical (assuming the list order is not changed( ]# h, H6 S/ q2 `
// indirectly by some other process).
7 G6 o! S1 J: T1 |7 b
0 G! n: Z8 \$ v$ C4 t6 p modelActions = new ActionGroupImpl (getZone ());
# ?0 z. k0 G; k# w
' Z) u8 Y0 w2 u/ I* g m U try {+ a- I) d+ r! o0 g
modelActions.createActionTo$message
( T. d4 W7 z3 l; v4 b% [ (heat, new Selector (heat.getClass (), "stepRule", false));. ]& @" ?% A* |$ s7 O% @+ ]
} catch (Exception e) {
& T- I9 V/ {$ q7 a1 w System.err.println ("Exception stepRule: " + e.getMessage ());1 M2 ]2 ?, O9 \1 i
}/ a: X$ h8 I8 T) G2 b8 |
+ r8 B, L& j$ X# n* s) f try {
8 J9 p; ^) \" i# {0 g( ^" C9 | Heatbug proto = (Heatbug) heatbugList.get (0);
4 K, n! I3 C, i! T0 \ Selector sel =
8 F) C0 w( B+ `* i: O1 d new Selector (proto.getClass (), "heatbugStep", false);# d0 m: Y9 W _$ B; a6 V- s
actionForEach =0 |" i6 q5 t! K b! _3 b8 _1 b
modelActions.createFActionForEachHomogeneous$call
+ A$ n- b0 A, A/ N (heatbugList,
8 k" M4 d1 u1 M( G* }, e+ g new FCallImpl (this, proto, sel,
& r9 R8 f# @/ {9 a7 | new FArgumentsImpl (this, sel)));
( ~% a; Y" N4 R* X3 @ } catch (Exception e) {- B3 X" _8 t r N, [7 e$ r! Y
e.printStackTrace (System.err);
6 C* u4 `4 \0 E+ H0 I, C- j* Y }4 Y3 z& H* F2 t& D1 \
1 [+ g+ C5 b( e/ J) {$ X
syncUpdateOrder ();
7 }( M8 d: V' e ^
& {% k& u Y. |/ b7 ~ try {/ ]/ B3 l4 H, y
modelActions.createActionTo$message
, [" r! s" C; {7 _- ~4 U3 g6 ? (heat, new Selector (heat.getClass (), "updateLattice", false));
3 i) y0 f ?. [" J4 v: o3 j+ l } catch (Exception e) {
3 w8 p8 X4 @# h0 s, f3 l+ K! y$ T( p System.err.println("Exception updateLattice: " + e.getMessage ());: O6 l+ a7 `3 }( B! e
}7 ^& `2 e& Q' F* ~6 z
" C' x/ x/ I! P0 ^- {4 O
// Then we create a schedule that executes the O6 b" D. g, j, z( i5 _" P
// modelActions. modelActions is an ActionGroup, by itself it
% r( |5 Q; X) A7 v5 q0 o8 x // has no notion of time. In order to have it executed in
0 O7 h: P- ]4 T" W k5 i // time, we create a Schedule that says to use the- K. Q6 j/ I+ J
// modelActions ActionGroup at particular times. This
2 L; O; l$ [+ L/ R8 p3 x; V0 f- E // schedule has a repeat interval of 1, it will loop every3 Z7 t( R- R: X
// time step. The action is executed at time 0 relative to
6 j& R8 Y& ]! G1 Q3 Q3 C // the beginning of the loop.
' ~3 t4 w- Q5 W1 C: j* Y
6 ^& B& ~7 b2 [/ ?5 ^ // This is a simple schedule, with only one action that is
4 \# X) {5 w- e: q7 u8 F+ o9 S // just repeated every time. See jmousetrap for more
0 R. s9 a7 Y8 p. B- K // complicated schedules.
; l+ b8 Q8 W6 U3 e% A, N% R 7 w* n$ |, b- m
modelSchedule = new ScheduleImpl (getZone (), 1);
7 {! I2 Y) s7 e3 F( ? modelSchedule.at$createAction (0, modelActions);+ |) ~ O2 r9 n3 l3 w. a
# t" }' k2 j/ M: S# q
return this;# w" c5 N+ @# }# Z5 l
} |