HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
& M) N* v; P* O$ [# q- B* S% ], G
/ L3 C8 n6 L+ o" t: G6 y public Object buildActions () {
8 {: `$ n$ k. {. |6 e super.buildActions();
8 J8 [+ O& m. F 6 D: R* [% P* c
// Create the list of simulation actions. We put these in
) b9 K" f( t) o* q6 _4 ]! b; Z // an action group, because we want these actions to be
' A8 t; ^1 [9 y; _4 P // executed in a specific order, but these steps should# z! B+ [ D' b* [. v
// take no (simulated) time. The M(foo) means "The message$ I8 E% G8 U' ^% v" M$ J
// called <foo>". You can send a message To a particular
$ }8 Q9 _. M6 l" }2 p5 b // object, or ForEach object in a collection.$ m& D6 U( @4 Q: k( X3 I2 X3 w* j
9 K8 z# z- s& J$ o/ y" H // Note we update the heatspace in two phases: first run0 W2 O& i2 ]/ k
// diffusion, then run "updateWorld" to actually enact the4 h) o; T' b! d! ~& w/ S0 K
// changes the heatbugs have made. The ordering here is
( ]. V& I, S7 h* J9 w1 j( O // significant!
6 h% \9 l. c$ f8 A) O7 u; C " u+ \8 r' O9 @! \9 h
// Note also, that with the additional6 L1 b) A: V! D1 m }
// `randomizeHeatbugUpdateOrder' Boolean flag we can3 ~2 \7 W0 _5 d" g I+ a4 }
// randomize the order in which the bugs actually run
, D9 e% u- i/ B% ~/ n) C // their step rule. This has the effect of removing any* p5 P+ s g9 n$ |: Y/ L
// systematic bias in the iteration throught the heatbug
' o" ], Y& e8 J$ [7 T // list from timestep to timestep% x4 p) v: U$ t0 d w; O; |$ I
8 X2 _0 u% H) b( s8 ~ // By default, all `createActionForEach' modelActions have
y# V$ M# g* s1 {3 o* o& n0 F // a default order of `Sequential', which means that the
1 Z7 `, k8 b9 E" p& ~; o5 h7 u // order of iteration through the `heatbugList' will be
. U0 f. m7 v& g l5 t! b, x$ L // identical (assuming the list order is not changed
& w6 g1 ^, i: ~7 s# p: T9 q- A* i // indirectly by some other process).
1 x; _! {) g9 K2 x+ B" A' R % Q! K9 k( Q( T3 F
modelActions = new ActionGroupImpl (getZone ());! ?& `) y' q3 {4 p4 G9 \; N1 W
& r6 l6 z) C% f' ^) L7 E
try {/ z) D3 a [& i6 _+ N
modelActions.createActionTo$message
2 \# A* Z" ~6 Y/ i) H (heat, new Selector (heat.getClass (), "stepRule", false));
' l9 t8 Q+ k' H. e9 F7 d f9 a/ ^+ ~ } catch (Exception e) {
8 ^% m U- Q) m System.err.println ("Exception stepRule: " + e.getMessage ());. B" ^) H3 E- Y% S! d
}
( U: H1 a! c2 o# d& s1 X. M3 _. [! [/ e) i1 k
try {2 }- K. o5 C# a+ G6 b' [
Heatbug proto = (Heatbug) heatbugList.get (0);* V5 i8 P$ y% Z
Selector sel = 0 ?& D9 X d4 W8 e0 x4 l1 d7 s( \* a/ V
new Selector (proto.getClass (), "heatbugStep", false);
]0 Q+ Q5 y0 R- x' K" C actionForEach =/ A8 Y9 H* @3 d2 j, g9 }* ?$ G
modelActions.createFActionForEachHomogeneous$call
9 k; n# g5 i$ h' h# \( N, b. z (heatbugList,% b! E8 D* K, ^4 Z, g8 p
new FCallImpl (this, proto, sel,
2 z3 r1 \/ ?5 S4 ], r4 { new FArgumentsImpl (this, sel)));& B2 \1 \! D H7 ^
} catch (Exception e) {7 {# M# H/ r8 r/ l1 g. t
e.printStackTrace (System.err);
$ h+ }5 t/ t( A+ p, H3 f }, L2 P; Q3 k/ h* B8 k: A
( g: p1 C0 P* J0 a- A8 Z& ~
syncUpdateOrder ();
- ]$ N/ ?. Z W t I H
7 i* f. O% p+ u' o& s4 _# r try {
" u0 K5 H, L7 a& P6 B modelActions.createActionTo$message 2 _% |( h' a$ G1 s6 [ _
(heat, new Selector (heat.getClass (), "updateLattice", false));
$ Y8 u& t' M/ `! i6 G2 u2 |5 Y3 n5 g' } } catch (Exception e) {
, z5 @1 i9 J7 v$ n8 T System.err.println("Exception updateLattice: " + e.getMessage ());2 _' T7 \8 q( l7 l
}( T3 S% A7 g8 n+ r& Z# F4 N N. \7 J0 i
, |% v2 v# M; w( a // Then we create a schedule that executes the
0 Q" D2 A$ T; J6 g0 j5 @$ _' M // modelActions. modelActions is an ActionGroup, by itself it
" r6 l# S) I' q5 w2 j // has no notion of time. In order to have it executed in
4 v# P3 n. @" j! n5 b0 z& f // time, we create a Schedule that says to use the: F! @0 n1 U# ?& D% s9 N$ S E( }6 I# N h
// modelActions ActionGroup at particular times. This
" j3 C' T; i. m9 F // schedule has a repeat interval of 1, it will loop every7 t2 Y+ ~- y+ G% \( S! H7 k
// time step. The action is executed at time 0 relative to
9 f5 P \* `2 |7 q6 N0 F // the beginning of the loop.) |% K; {5 a+ M$ C& d# `$ f! I6 A
; m; W$ E, v; a: {8 P$ y* W' C9 M
// This is a simple schedule, with only one action that is" B! t, U! v4 t* ?6 y2 }
// just repeated every time. See jmousetrap for more3 Z& d3 M- K5 A- l# m
// complicated schedules.
: w" ^/ Q& r& v( q$ a1 o' N7 ~
4 h2 u, \( m: \ g. H1 B& E modelSchedule = new ScheduleImpl (getZone (), 1);4 s- q9 Y. F, ?
modelSchedule.at$createAction (0, modelActions);3 O$ z* F1 j6 W6 M% j
* {4 q. @1 W6 W: m! f0 [ return this;
( l7 H# b' }3 Q$ e+ P } |