HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
6 ?; L* L3 r5 I* v
* ] a2 f2 f& Y6 Z public Object buildActions () {% @ `; s' o8 P F" M, M V( S4 j
super.buildActions();
. G/ d4 I7 z. B) L! O2 [ ^! Q! F6 G2 _* F3 b
// Create the list of simulation actions. We put these in0 u8 h8 c0 o f7 N/ B
// an action group, because we want these actions to be
( X- f6 y1 ]: h" V; Y% G // executed in a specific order, but these steps should8 u; ^# v! J; q3 s% N0 l5 T
// take no (simulated) time. The M(foo) means "The message
, h7 q+ ~( P8 z+ P, t3 E // called <foo>". You can send a message To a particular: Y& _6 e7 T& K# T9 V2 a! r
// object, or ForEach object in a collection.
* q- [% g2 v6 T* H8 c0 E8 A$ ~
) d4 o' K9 t; w4 J, C0 \3 V2 {$ P // Note we update the heatspace in two phases: first run2 ]. M, s' x( l9 _% h) Y
// diffusion, then run "updateWorld" to actually enact the9 X1 S3 S7 w2 X( u5 k+ P c
// changes the heatbugs have made. The ordering here is
# W' s# t# ]7 ?& q+ a# o // significant!
! L4 {8 b2 D9 `6 ^) M$ Y # w* z, ~7 {; [. c
// Note also, that with the additional
+ l3 E- h' L& z' U // `randomizeHeatbugUpdateOrder' Boolean flag we can
! p7 S* o: E6 } // randomize the order in which the bugs actually run
0 M ]/ @: s. g9 _% Q! M // their step rule. This has the effect of removing any
6 n% z8 g1 x" s4 t, C% f% f$ @ // systematic bias in the iteration throught the heatbug: H4 K0 s, x# V
// list from timestep to timestep
1 }0 r! b1 [! Q! d& C# p6 d : U$ m2 Y" l1 @. ?
// By default, all `createActionForEach' modelActions have# c% p, w! z: f6 f
// a default order of `Sequential', which means that the
2 f! D& p; M+ L9 J) k9 g r // order of iteration through the `heatbugList' will be
3 e/ Q. W) H0 K* t q) K) O // identical (assuming the list order is not changed7 b& `+ A1 g: r3 e" S( d7 [3 y
// indirectly by some other process).
6 k+ g& n, b0 F0 ]& S* s( y _
, e9 w& E; g0 {/ }3 h modelActions = new ActionGroupImpl (getZone ());
& K) }4 h5 }8 W1 F* l) D0 r: t) Q2 t6 h: o" X
try {
8 K4 C) Y8 s: U modelActions.createActionTo$message" k4 B5 l$ C/ y% n! j, i' h8 @' d
(heat, new Selector (heat.getClass (), "stepRule", false));9 k6 e# V3 ^9 f& P1 T Q
} catch (Exception e) {9 D- I( G0 ^/ o" L/ L2 l
System.err.println ("Exception stepRule: " + e.getMessage ());- s, G6 T8 ?, |0 g6 u8 C$ a
}7 t0 |6 y4 z" @8 g' j
3 [0 z) t% c4 z4 ]5 S try {
! h3 p* R) l7 j- C; G& q' R7 l) ~& L Heatbug proto = (Heatbug) heatbugList.get (0);
% l6 G) {* h4 v& s7 C Selector sel =
4 C1 C# Z% d+ e5 J( u! E new Selector (proto.getClass (), "heatbugStep", false);
8 T* J* x) W y+ ~ actionForEach =
, O X/ p5 v2 H9 W modelActions.createFActionForEachHomogeneous$call" }- y. ~5 e* K5 O }
(heatbugList,8 e* Y6 s0 k% T5 R- }8 q3 O
new FCallImpl (this, proto, sel,! V, w; [" \6 `' e, e; d4 _, `
new FArgumentsImpl (this, sel)));2 j+ q [2 Z) [! [8 q6 m$ {/ K- d
} catch (Exception e) {& K' W7 \3 @$ |4 ?8 k
e.printStackTrace (System.err);5 z9 n0 I' u: n0 z3 |
}
" m4 X! f- o) m! [% E: t) ~2 A0 L 9 {5 |; J0 @* N# Z! a
syncUpdateOrder ();2 P, m4 g; R) E4 J _ F0 f
1 }) b4 p+ i0 _
try {
! g6 g$ j8 C3 ~- i; l2 ]$ G modelActions.createActionTo$message
; \9 t# w2 }1 L/ a" a5 u# Y4 b (heat, new Selector (heat.getClass (), "updateLattice", false));
0 d/ J8 A7 J2 q, \ } catch (Exception e) {
; L) ?: C7 ` k3 @8 P' T7 } System.err.println("Exception updateLattice: " + e.getMessage ());
P. a7 J0 p" Y( F2 u4 Z! \ }2 W/ b% P: k W, v( ?
- N, `% d* k' p7 P* O7 {$ U
// Then we create a schedule that executes the
) f! Z6 v* C" \# |# [. X- l7 V // modelActions. modelActions is an ActionGroup, by itself it a& f8 O- P. I
// has no notion of time. In order to have it executed in
3 _. `. e% F& {. L6 g // time, we create a Schedule that says to use the
7 ]7 B. E+ `7 C4 `' V" E // modelActions ActionGroup at particular times. This
; n. j- k; k# }6 r: V* D // schedule has a repeat interval of 1, it will loop every. W3 i- j. M+ I- s1 r
// time step. The action is executed at time 0 relative to
3 n! N3 u2 w3 l$ R$ r( H& C // the beginning of the loop.* }5 W5 Z! D2 l0 }( Y6 d2 t4 z/ J
8 D( v" q# p. a# {- Z: B- W) x // This is a simple schedule, with only one action that is% N# G( o; f& r& A4 h
// just repeated every time. See jmousetrap for more
9 Q. x j* ]; ~ I1 I+ N // complicated schedules.
0 c+ a% p4 f1 `- t, {6 Y# M3 a8 C n) K |
3 M' |0 b4 `$ R modelSchedule = new ScheduleImpl (getZone (), 1);. B: j& a2 S# n7 b
modelSchedule.at$createAction (0, modelActions);
5 k' h C* Q) j4 r/ O4 N8 }
+ |- l! E+ ^$ x W2 e return this;
, \. b! s% q4 V* A: Z2 A/ H% s1 P } |