HeatbugModelSwarm中buildActions部分,3个try分别是做什么?查了下refbook-java-2.2,解释太简略,还是不懂,高手指点,谢谢!代码如下:
6 ~+ C' a0 z4 T
- ^$ R& G- @+ b- N$ J public Object buildActions () {
5 b7 g p) R `& A super.buildActions();
: |* b. F3 Y3 u& O/ x+ E( a) ] O7 S E
$ W( p; H% p1 O4 c3 w# x% q) } // Create the list of simulation actions. We put these in' e }0 N/ I" l* l; Y% [! J
// an action group, because we want these actions to be
4 z8 p/ C1 F" a // executed in a specific order, but these steps should* n& ?! Y/ k% k9 {; R$ v7 z
// take no (simulated) time. The M(foo) means "The message
) x* f# y% o0 u, I* l& W5 @ // called <foo>". You can send a message To a particular
" }+ q9 ?4 o7 l% ?( P5 A, I2 e // object, or ForEach object in a collection.0 Z4 S9 |5 k! r+ R) s+ {, ]& h
5 ]( m) e, a3 ^3 `& }% ^ // Note we update the heatspace in two phases: first run3 ^/ [% \. q. h1 _8 k! \0 T
// diffusion, then run "updateWorld" to actually enact the
0 Q# T8 K/ c& n) o! A // changes the heatbugs have made. The ordering here is
1 B. f9 V E5 X/ l, o // significant!! J7 c3 {% Z; `
5 Y, x! X" u0 E! C$ z: ^! \
// Note also, that with the additional+ i$ ], u6 f3 ?- z
// `randomizeHeatbugUpdateOrder' Boolean flag we can$ D$ t7 y- E+ K6 {# G# |" H; x0 y
// randomize the order in which the bugs actually run
: b; W& Y1 B+ Y! a9 y( b // their step rule. This has the effect of removing any0 Q1 F# l6 c1 M
// systematic bias in the iteration throught the heatbug
& O( B0 q5 A4 j9 H4 p+ J9 _ // list from timestep to timestep
& ~6 {+ b3 b9 S1 ~2 c 0 x- e+ p/ h; _7 Q7 [( _
// By default, all `createActionForEach' modelActions have* M: o* w# V T- {( F- Z
// a default order of `Sequential', which means that the; F1 t3 B% p' r1 k ?
// order of iteration through the `heatbugList' will be
* Y0 i) ~" p; j3 H6 p7 i // identical (assuming the list order is not changed
@/ p( q9 F" |! \5 l // indirectly by some other process).4 q. I% g: f6 `# ~' T1 C( ^7 k
) O) [* x% A1 y1 O+ H/ ]
modelActions = new ActionGroupImpl (getZone ());3 w- q5 v+ h- f) o7 b
4 W* G8 h! x6 v8 A try {
0 Y/ b$ F; Y. ], F2 w) o/ Y! P modelActions.createActionTo$message
. _$ d* T' B: G9 Z (heat, new Selector (heat.getClass (), "stepRule", false));+ k8 l |# V: U
} catch (Exception e) {
4 W9 b' j; ?; X$ W. q: D" Q! Q System.err.println ("Exception stepRule: " + e.getMessage ());
) Z. q, J; Y! h }$ P8 X- `) Z4 k# |. k
, L0 o; w5 u4 o, l9 l' {/ j# a
try {
# Q2 Z7 _2 Z. J" J3 X" U) B Heatbug proto = (Heatbug) heatbugList.get (0);
! t# ?6 ~! @0 [; j5 i- @( c' X; @ Selector sel =
' z: Q2 m" {: M" X) v+ { W8 k new Selector (proto.getClass (), "heatbugStep", false);, _' o# g( ?5 X! F$ I; P$ L: e% |
actionForEach =
t1 M8 h0 M9 |+ V) S9 w, F modelActions.createFActionForEachHomogeneous$call
1 n- `" b# z* A6 D1 \ \1 C (heatbugList,
" Y+ e. ^8 u4 ~: J9 m' t& ]: l new FCallImpl (this, proto, sel,
}' ]! C( ]# X9 w& y+ Y4 T new FArgumentsImpl (this, sel)));
, H, C1 d: D9 k" a/ N+ c( y } catch (Exception e) {$ `& O* P9 z- ]- F
e.printStackTrace (System.err);
& J% } T0 E, Q1 Z; Q v }; r" `* \5 R( o: J) \5 y& O4 S
9 k& d g: I. N3 t* a3 O syncUpdateOrder ();
% I- i5 n" e2 V& X: K) U8 N* k+ {8 D: f( i3 v7 A
try {: n! M( i: F) g
modelActions.createActionTo$message
9 j- O* t L! j1 G, f9 t2 Z (heat, new Selector (heat.getClass (), "updateLattice", false));* f; E! w% H) F1 e5 D3 u7 ]* f
} catch (Exception e) {
# G+ @! s7 x) ]0 }. h* J! n System.err.println("Exception updateLattice: " + e.getMessage ());4 b1 G% d* J m! W: R5 k6 K
}
; [/ r# U( ^, w% v 2 o! H) | \0 s, z+ B7 y6 x
// Then we create a schedule that executes the
4 p; T5 T$ h5 l. D; `. A // modelActions. modelActions is an ActionGroup, by itself it
1 ]# m8 R$ Z, K! R' j% t // has no notion of time. In order to have it executed in
0 v* N5 S8 q; ^; t% v) {% a // time, we create a Schedule that says to use the
1 \. i0 X* V1 Z // modelActions ActionGroup at particular times. This& O0 E" F' T, E9 r3 m' }" A
// schedule has a repeat interval of 1, it will loop every; Y# [; y0 S9 D; T$ ]
// time step. The action is executed at time 0 relative to
^) X5 b- z# y5 T3 h // the beginning of the loop.
: {& z9 ^: F$ X/ B: U
( f: g c( n. z- H3 X$ h // This is a simple schedule, with only one action that is
7 d9 E/ k) M2 B9 A! I: ^ // just repeated every time. See jmousetrap for more- W% B/ L: V6 d; l
// complicated schedules.
; ^4 j5 t- b. k5 f. i7 z
3 c, G4 N+ [0 c6 B modelSchedule = new ScheduleImpl (getZone (), 1);
/ t% k. h+ O1 N/ H& @ modelSchedule.at$createAction (0, modelActions);
. M* M; S: l( W7 O
2 Z% T. R0 [5 t6 h8 p4 F! w return this;
5 @% Y+ Q/ V @) P* w% v2 a } |