HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
3 \4 p: M, Z8 x( h- _
( y$ o2 d' R8 g* f+ s) R6 a0 P1 W public Object buildActions () {
0 S/ `7 w7 _* e, O/ u+ h& F* z1 A super.buildActions();. n) O" {7 z$ s& q
( M6 l! {1 h1 s6 f+ u // Create the list of simulation actions. We put these in
* H! W* R9 @, u' ^ // an action group, because we want these actions to be) `' i# q$ U u' ]) Q8 u
// executed in a specific order, but these steps should6 j" j& M6 T/ P$ [
// take no (simulated) time. The M(foo) means "The message. B/ k/ O) m# Z7 n" y) W' i
// called <foo>". You can send a message To a particular
; r1 b# t: x- Q+ c // object, or ForEach object in a collection.! n! V7 K. e* L- h0 _
$ x3 t; k9 s: w: G% p, C
// Note we update the heatspace in two phases: first run5 l" D! q c) v) u! f8 D; ^$ j# p
// diffusion, then run "updateWorld" to actually enact the
- t0 L+ V/ n( a; e' [8 x // changes the heatbugs have made. The ordering here is. x4 B* J: A8 c- F0 S9 O6 b2 k
// significant!+ F4 i8 T: D! y& \* {: O
3 R" V" p' h2 R; @% P% Y0 A
// Note also, that with the additional+ [( r8 W* K& t3 u
// `randomizeHeatbugUpdateOrder' Boolean flag we can
3 C; F. C7 Z9 m // randomize the order in which the bugs actually run N* `( q1 r) }7 k
// their step rule. This has the effect of removing any* y9 x% ]4 v8 E# _! v- E6 ~ b
// systematic bias in the iteration throught the heatbug- I& F V1 k" G- m
// list from timestep to timestep# Y7 K( }% v0 ~9 e' @2 l
1 ~3 B4 J$ n9 Z) ?$ ]; g' K7 { // By default, all `createActionForEach' modelActions have+ V+ u5 k( z: R, M
// a default order of `Sequential', which means that the
/ [, }! ?5 G+ T. R1 y // order of iteration through the `heatbugList' will be2 Q: H# T; h0 o. u
// identical (assuming the list order is not changed
) _# N6 s. V% A1 t( L& }4 N // indirectly by some other process).
: g H6 l9 w' k. x8 { 1 [5 _; K, L& N2 S9 E( X
modelActions = new ActionGroupImpl (getZone ());4 e% j+ J7 G0 C: q- ?) @2 }; G! k
- O+ C( V6 n" M+ p+ y# ?& G( q# G
try {. L) a5 K: G9 j6 a* t# H2 @$ f: V
modelActions.createActionTo$message
" }2 z" d n! N8 {; d (heat, new Selector (heat.getClass (), "stepRule", false));+ l) K7 v. f% i0 i& X, a
} catch (Exception e) {
1 W" {8 P# @8 R3 h' `5 Z6 \7 l% j System.err.println ("Exception stepRule: " + e.getMessage ());. W6 I* v$ P- ~2 X
}/ ~6 F% P+ E5 f2 n& b7 ]# V2 J
* B1 Y& } W" e* M
try { M" n! `' L: s% i/ O2 O
Heatbug proto = (Heatbug) heatbugList.get (0);
9 w# v' z3 ~. |' G" \9 @+ c) V3 ]$ R Selector sel = * b8 g, Z* c) y0 N- M# ~4 U7 v1 E3 \
new Selector (proto.getClass (), "heatbugStep", false);
% L4 Y2 D) k3 `6 m9 ` actionForEach =
7 P- f) N7 m3 @7 ^ modelActions.createFActionForEachHomogeneous$call
5 Z6 D2 E3 g" b9 n c (heatbugList,
: p; \5 i" ^$ _1 }- m0 J" ~ new FCallImpl (this, proto, sel,6 O1 n: v& E' J5 M; ]4 \9 e
new FArgumentsImpl (this, sel))); M0 o9 i& Y/ E9 c
} catch (Exception e) {
8 S; v2 d3 L z5 p3 y0 X9 D$ p: _ e.printStackTrace (System.err);3 S# V3 ? n) [
}
1 }- \) K2 w* }, b, c : c8 L# t" L$ l
syncUpdateOrder ();
: I8 [5 D$ p' `4 U" B" ~; n
3 ^; s' T1 A0 N try {7 V+ ~2 J0 T1 Y+ E
modelActions.createActionTo$message ) v. b2 |- Z" ~# c
(heat, new Selector (heat.getClass (), "updateLattice", false));& Z# b) a4 J! C+ i' B( Y
} catch (Exception e) {
* r* x5 q! `$ L& L; N System.err.println("Exception updateLattice: " + e.getMessage ());
, I/ Q/ f* y8 q# m! H r: K }! v, R2 q! P9 ` t0 v1 E" T1 g: a
! @( Y& s6 T. w7 }) P8 Q
// Then we create a schedule that executes the
9 o1 Y% U9 K4 C* T8 W // modelActions. modelActions is an ActionGroup, by itself it" Y% ^5 _7 z6 t2 X
// has no notion of time. In order to have it executed in7 U; K% l! y6 g$ y
// time, we create a Schedule that says to use the
6 `( H1 A7 H" F8 w! x8 `6 [ // modelActions ActionGroup at particular times. This
j. }# Y8 p+ k' D/ Q; d // schedule has a repeat interval of 1, it will loop every
% r/ z# a, | M // time step. The action is executed at time 0 relative to
" x; u7 u, d" y* \0 a1 u: j) { // the beginning of the loop.+ s5 t" _4 s9 A; n
, V7 X b5 m0 j# M$ W // This is a simple schedule, with only one action that is
# E. \& `7 d3 |! W6 Y0 [) W) c" j // just repeated every time. See jmousetrap for more( u+ V* R! k7 H% ~
// complicated schedules., Q: ]( L# ^% X% B0 O, I
# v5 I |: a! x4 } modelSchedule = new ScheduleImpl (getZone (), 1);
$ v8 z+ c8 j N" y% a) x% b modelSchedule.at$createAction (0, modelActions);
) }; C/ k" X! |, I' s O6 W
5 @2 m$ {5 C4 m- g2 d return this;
* X% v- A' Y% g+ |2 W* H } |