HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
5 _& z0 v t, E/ v+ X4 |5 J: l7 I
7 p: o. a$ p7 L* J6 h# g& y public Object buildActions () {, p X' v1 r% l6 f! n
super.buildActions();
% I$ \! g% G1 A3 u) T8 j$ y 7 Y8 T3 f3 @( X. ?3 i
// Create the list of simulation actions. We put these in4 x* O' ]' l1 {( t5 g( a% G8 n- Z
// an action group, because we want these actions to be
6 ~1 [" }$ a9 `' | // executed in a specific order, but these steps should
, ]6 W, T; p& X. f" @2 n // take no (simulated) time. The M(foo) means "The message: ?6 l' y$ w. r
// called <foo>". You can send a message To a particular! H _8 s) j# u& f5 K" T, R& E
// object, or ForEach object in a collection.) E$ n. D ?3 v* P: K0 u6 k3 P# k( m
3 f9 m& {7 V1 a) ~7 R/ L4 U8 A // Note we update the heatspace in two phases: first run. P$ u Z* {8 O& K P& B5 z; h
// diffusion, then run "updateWorld" to actually enact the
# w; v3 b$ ?+ F // changes the heatbugs have made. The ordering here is# u4 m1 s: t! G3 K0 D0 e; W. G' o
// significant!
2 k9 r6 Y. K& G. A% t) F
: P# V+ Q( [/ B& y& [1 z& j: n$ l // Note also, that with the additional( P9 N4 ]! R2 H
// `randomizeHeatbugUpdateOrder' Boolean flag we can M! ]4 F" E' |7 R* E
// randomize the order in which the bugs actually run8 ]' p% c j: Z4 \+ s
// their step rule. This has the effect of removing any
6 E2 Q* u* Y! v) _! E* j' I `) e k // systematic bias in the iteration throught the heatbug
- `6 l8 v4 t0 q- c // list from timestep to timestep' ?- y. Q& m- n4 e
/ @# d' }$ n; @. y5 A
// By default, all `createActionForEach' modelActions have
" i6 J5 Y/ }' @9 l' f // a default order of `Sequential', which means that the1 ^: J# }: D4 I7 `- D! ~ n
// order of iteration through the `heatbugList' will be
. p2 A8 E/ a0 j% G$ N5 U // identical (assuming the list order is not changed& t) u9 I- y; [/ R. C7 }
// indirectly by some other process).
6 J3 h4 S7 W6 g* G
2 o1 n, x( a( S$ p! A$ C7 L modelActions = new ActionGroupImpl (getZone ());
4 j) `! p* I- J; s" \0 H
# a# ]- q, t) c7 a0 W/ I7 b try {1 ^1 f' N% K2 {6 }" Q, b
modelActions.createActionTo$message |8 L* l' w1 A! p
(heat, new Selector (heat.getClass (), "stepRule", false));1 ]/ p) {7 f0 o: \
} catch (Exception e) {
/ f D. `$ w# h0 m4 r System.err.println ("Exception stepRule: " + e.getMessage ());
9 H3 r0 ~. _( W. z4 b, C6 } }
) y6 Z. u( j6 S1 \9 K& n# X' N) W0 H9 N$ U$ C% ~
try {
' w7 y2 {( L" g, A8 \3 Q1 `8 N Heatbug proto = (Heatbug) heatbugList.get (0);+ ^- e) G4 x8 J9 K2 X
Selector sel = . n$ h0 f/ ^6 y% m! z
new Selector (proto.getClass (), "heatbugStep", false);
1 F! b* V; A, O" w8 [' | actionForEach =( O+ Y* I7 Z% D4 a
modelActions.createFActionForEachHomogeneous$call
; `# b+ P3 Z) ?% G, b; k$ K! \1 { (heatbugList,
( ]1 |& I" }4 q0 T7 E& [% u, a4 [ new FCallImpl (this, proto, sel,
+ ^8 h& J9 f1 j3 e$ `( m0 C: Q( n new FArgumentsImpl (this, sel)));% F6 O- j+ @# U8 f
} catch (Exception e) {8 X! n, m2 Z9 ]& S0 e6 E
e.printStackTrace (System.err);# i2 K- W( D+ v7 o# i1 L
}
1 K9 ^' f' w+ {$ {: ]- T% ]
: E! [0 o6 L" s syncUpdateOrder ();0 Q% U+ R' e* |9 C! R' x3 m2 P
8 h* N( e0 p3 W
try {
/ s; X& u* q6 u: ^. w3 [6 z modelActions.createActionTo$message
& S0 N: q1 I9 K0 k6 X0 i; [ (heat, new Selector (heat.getClass (), "updateLattice", false));0 ]# a! C4 U( S$ d( ?+ W
} catch (Exception e) {" }, }6 O# N+ X5 ]! G! V% z
System.err.println("Exception updateLattice: " + e.getMessage ());
/ U9 E" z, n) a4 U+ `( b+ {( R }
4 H2 [: [, g! }' n3 P - Y6 ~- U+ y- a o. y5 D' ~
// Then we create a schedule that executes the1 v9 |9 z d; M: q+ A
// modelActions. modelActions is an ActionGroup, by itself it. v3 t& E/ T; v2 T
// has no notion of time. In order to have it executed in
$ B4 |( q. `+ i- Q. ]1 ~' @3 I, l% O5 d // time, we create a Schedule that says to use the3 [1 q* n( ~- ~1 {; o; n
// modelActions ActionGroup at particular times. This2 {8 T! }8 L& z/ L9 S8 h
// schedule has a repeat interval of 1, it will loop every
3 w A8 t0 }; E. M. Q5 {5 Y // time step. The action is executed at time 0 relative to, S( Q2 |. h$ G4 |% w2 P
// the beginning of the loop.
. V6 h4 W, H4 N8 d+ ~% g1 s. E8 y0 S* A* e
// This is a simple schedule, with only one action that is
$ m2 D5 C/ F; N/ [2 y% S& Q // just repeated every time. See jmousetrap for more
8 a5 `& }% L) H$ K3 ~+ U // complicated schedules.
. E. ?/ B" n& J i3 \3 G ! ]% Z" Y' z$ o9 Q* T
modelSchedule = new ScheduleImpl (getZone (), 1);
1 S' H$ U! D6 y% {( n+ d# o modelSchedule.at$createAction (0, modelActions);
) p' z' J9 q- i' O9 g0 {
# ~, ]) @( U' }; s return this;
U. C0 I3 x8 d3 X5 S4 d& t5 G/ k } |