HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下: @, @2 D, T0 o1 E9 k9 ~- t
2 e- X+ B( J8 G2 P9 k' D4 h" y7 j! J
public Object buildActions () {- J/ P0 P* {. {8 y) o
super.buildActions();
4 _6 H" B' P% K* L: n ) I2 F9 W, l8 R& K8 }& y l
// Create the list of simulation actions. We put these in
# O! U* ]: {3 K8 @% z // an action group, because we want these actions to be. f" @" @/ |( O: R, f
// executed in a specific order, but these steps should8 m5 l* ~- B. e
// take no (simulated) time. The M(foo) means "The message: ?( x; i* ]3 Z8 }) m" l5 _0 [
// called <foo>". You can send a message To a particular
. I" e' w% a% d6 Q2 n: l // object, or ForEach object in a collection.
) z. O% P3 F6 _ b
) m4 b7 ~& I7 q6 f // Note we update the heatspace in two phases: first run
: a, S; Z) R; Y // diffusion, then run "updateWorld" to actually enact the- ]: J( G. z/ t7 h/ Z3 h- }
// changes the heatbugs have made. The ordering here is
1 a# F p/ d8 q7 Q& l* B, e // significant!
8 T# i8 t/ n9 n: X
4 a5 A ]1 N& y. |, U // Note also, that with the additional
1 N" s% u6 f) s' [( N- _* S/ Z: W // `randomizeHeatbugUpdateOrder' Boolean flag we can
' H7 b5 b6 B. I3 L* n // randomize the order in which the bugs actually run: y! W$ }* j! u& p3 f- U6 Z2 q
// their step rule. This has the effect of removing any
& ~4 d' @) l+ `9 E$ a // systematic bias in the iteration throught the heatbug
8 _2 U- i3 s. o/ D7 F1 {* c# o/ q9 j // list from timestep to timestep- e8 d: u; Y% t i1 f+ h
, H! p ^$ C+ f7 ~' k // By default, all `createActionForEach' modelActions have/ `$ P" |) O6 X
// a default order of `Sequential', which means that the
6 }& T, T# [/ X" R* T8 d/ K // order of iteration through the `heatbugList' will be
5 T2 F, `3 e; E% I5 o // identical (assuming the list order is not changed, c' `& g, o. Y( V2 D" ^
// indirectly by some other process).! z0 `" e i$ `# [6 ?2 C
& _, J/ @6 ~9 ~8 T3 P9 J5 |/ B; \
modelActions = new ActionGroupImpl (getZone ());& t' D" |7 l$ K E( L
6 q1 ~: K+ Y1 Y try {5 n! J7 G, O; F) C, x' s2 n
modelActions.createActionTo$message
' q* q# b: C7 B8 Y& a! B# F% B (heat, new Selector (heat.getClass (), "stepRule", false));+ ^( |6 h. u- E3 S) D* r
} catch (Exception e) {
% g4 I' L3 r: ]; d System.err.println ("Exception stepRule: " + e.getMessage ());: \' i8 f0 E+ Y3 {
}+ E$ a! f7 A2 K/ i! c: y
: r! J$ m$ H( ~: X4 ~8 u% G( N* S$ ?
try {
* u! D; e7 Q' M) C- a Heatbug proto = (Heatbug) heatbugList.get (0);
0 D% |" x1 v: N6 n) g3 _ Selector sel = . |9 e9 m, _+ O4 k9 { j# }
new Selector (proto.getClass (), "heatbugStep", false);
& a5 }# e- w7 v7 m actionForEach =
9 H$ Z$ n9 u3 ~: G, k/ q modelActions.createFActionForEachHomogeneous$call# @, U* A3 [0 n4 C5 F/ n
(heatbugList,
6 n; K1 k# a1 E. |) B; i: r new FCallImpl (this, proto, sel,
+ w$ \: n% r9 N; }0 Z3 ^8 \. }0 D* L9 { new FArgumentsImpl (this, sel)));. C [. a; n6 T: Y3 V0 L! D z
} catch (Exception e) {
# y; ]1 z* j; O9 p' R e.printStackTrace (System.err);2 K$ G- b1 K [! x* v& M& \2 T
}* F6 M* |+ H, Y @; q) W
& B( H! ]* @# L' C+ z; P4 w
syncUpdateOrder ();/ ~* D3 H2 u0 K# Z, E
0 S0 F6 W9 Z6 f3 B4 l try {
) }; m7 r- t. [7 A. m2 ~ modelActions.createActionTo$message
4 q2 }7 B' @1 r, t2 l* q: \2 y6 y1 P (heat, new Selector (heat.getClass (), "updateLattice", false));
% k. K& r& i- _: B( O7 I2 o } catch (Exception e) {
2 k7 p6 m1 q9 t* b System.err.println("Exception updateLattice: " + e.getMessage ());
! f& b+ }1 K4 V }( S; |' @2 q8 o( c) c
4 w" P% O4 t& n2 O // Then we create a schedule that executes the) [/ \6 q! N) e9 k* R1 L- j
// modelActions. modelActions is an ActionGroup, by itself it3 { p' \: H& Q) k; M
// has no notion of time. In order to have it executed in
2 _( r' t) Z, U // time, we create a Schedule that says to use the
! d6 ?: Y J7 ~/ c- T // modelActions ActionGroup at particular times. This7 t' n5 j6 U/ v1 A
// schedule has a repeat interval of 1, it will loop every
9 y& H0 t2 E7 w. w9 q; g // time step. The action is executed at time 0 relative to
4 f5 E4 R, T& }% z/ W; A // the beginning of the loop.
K% P/ A4 G. K
, e* V; @# f! L7 P) y" @& c/ d // This is a simple schedule, with only one action that is
% b. _( Q* d, f# S t // just repeated every time. See jmousetrap for more: F0 ~2 p4 p! M2 `. P6 m% _
// complicated schedules.4 @6 f f ]5 ~+ [
+ v! o0 V% y2 \" E6 D
modelSchedule = new ScheduleImpl (getZone (), 1);
6 f* }& p+ J4 X7 j4 B modelSchedule.at$createAction (0, modelActions);# {: M* W- Q4 m7 }
' j( D' h8 D" T# A return this;% o$ K$ |7 |# h! H; P! E( w8 {/ U
} |